Googleフォームからkintoneに反映されない

「Google フォームとkintoneを連携してみよう!」を見ながらGoogleフォームとの連携を試みましたが、うまくいきません。

Googleフォームの「Stackdriverのログ」では「完了」と出ますが、「Response code is “400.0”」となっており、実際にkintone側には反映されておりません。

また、Googleフォームで送信する際に開発者ツールで確認すると「Uncaught Could not establish connection. Receiving end does not exist. m=viewer base:425」と表示されております。

因みに、別途作成した、全項目「文字列(1行)」のフォームについては、Googleフォームからkintoneへの反映が成功しております。

今回反映されないフォームは、ラジオボタンやチェックボックス、日付、文字列(1行/複数行)が交じっており、必須/任意の項目も入り乱れている状態です。(ただし、Googleフォームとkintoneのフォームのフォームタイプはすべてあわせております。)

 

お知恵をお借りできますと幸いです。

 

==コード(※サブドメイン、アプリ番号、アプリ名、トークンは伏せてあります。)==

function getFormResponse(e) {
‘use strict’;
var itemResponses = e.response.getItemResponses();//アンケートの回答を取得
var records = ‘[’;
records += Utilities.formatString(‘{“cand_email”: { “value”: “%s” }’, e.response.getRespondentEmail());//回答者のEmailアドレスの取得、文字列(1行)、必須(ただし、kintone上は「リンク」)
for (var i = 0; i < itemResponses.length; i++) {
var itemResponse = itemResponses[i];
switch (itemResponse.getItem().getTitle()) {
case “Skype ID”://文字列(1行)、必須
records += Utilities.formatString(‘,“cand_skype” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “パスワード”://文字列(1行)、必須
records += Utilities.formatString(‘,“cand_pw” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “姓(ローマ字)”://文字列(1行)、必須
records += Utilities.formatString(‘,“cand_last_name” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “名(ローマ字)”://文字列(1行)、必須
records += Utilities.formatString(‘,“cand_first_name” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “生年月日”://日付、必須
records += Utilities.formatString(‘,“cand_birth” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “性別”://ラジオボタン、必須
records += Utilities.formatString(‘,“cand_sex” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “国籍”://ラジオボタン、必須
records += Utilities.formatString(‘,“cand_nationality” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “居住国”://ラジオボタン、必須
records += Utilities.formatString(‘,“cand_country_of_residence” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “能力検定合格状況”://チェックボックス、任意
records += Utilities.formatString(‘,“cand_test” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “技能試験合格状況”://文字列(複数行)、任意
records += Utilities.formatString(‘,“cand_cert_GF” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;

case “PR動画URL”://文字列(1行)、任意 (ただし、kintone上は「リンク」)
records += Utilities.formatString(‘,“cand_url” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “PRメッセージ”://文字列(複数行)、必須
records += Utilities.formatString(‘,“cand_message” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;

case “働きたい国”://チェックボックス、必須
records += Utilities.formatString(‘,“cand_work_place” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;
case “求職状況”://ラジオボタン、必須
records += Utilities.formatString(‘,“cand_seeking_status” : { “value”: “%s” }’,
itemResponse.getResponse());//質問に対する回答を取得
break;

}
}
records += ‘}]’;
Logger.log(‘Response JSON is “%s”’, records);
return records;
}

function sendToKintone(e) {
‘use strict’;
Logger.log(‘Form submitted’);
var subdomain = “XXX”;//サブドメイン名
var apps = {
YOUR_APPLICATION1: { appid: X, name: “アプリ名”, token: “トークン” }
};
var manager = new KintoneManager.KintoneManager(subdomain, apps);// ライブラリーの初期化
var str = getFormResponse(e);
str = str.replace(//g, "").replace(/\r/g, “\r”).replace(/\t/g, “\t”);
var records = JSON.parse(str);//JSON形式に変換
var response = manager.create(“YOUR_APPLICATION1”, records);//kintone レコードの生成
// ステータスコード
// 成功すれば200になる
var code = response.getResponseCode();
Logger.log(‘Response code is “%s”’, code);
}

tom.kさん、Yoshidaです。

var response = manager.create("YOUR_APPLICATION1", records);//kintone レコードの生成

responseをログ出力してみてはどうでしょうか?

Logger.log('response=\> "%s"',response);

Kazuhiro Yoshidaさん

アドバイスありがとうございます!

responseのログ出力してみたところ、以下の様に出てきました。

==

response=> “{“code”:“CB_IJ01”,“id”:“lxXqUiJZUTp2IbFNopyT”,“message”:“不正なJSON文字列です。”}”

==

これでググったところ、チェックボックスは配列の形にする必要があるという情報を見つけたので、

チェックボックスの部分を修正したところ、無事反映されました!!ありがとうございました!!

 

=修正方法=

case “働きたい国”://チェックボックス、必須
records += Utilities.formatString(‘,“cand_work_place” : { “value”: [“%s”] }’,
itemResponse.getResponse());//質問に対する回答を取得
break;

==

 

ただ、Googleフォーム上でチェックボックスを複数個チェックすると

[“選択肢A, 選択肢B, 選択肢C”]

の様になってしまい、エラーが返ってきます。おそらく

[“選択肢A”, “選択肢B”, “選択肢C”]

といった配列にしなくてはならないのではないかと思うのですが、

どのようにコードを書き換えればよいかわからず、困っています。

 

どなたかアドバイスいただけますと幸いです。

Yoshidaです。

試してませんが、https://developers.google.com/apps-script/reference/forms/item-response#getResponse()

こちらに

>For CheckboxItem questions, this returns a String[] array containing the responder’s choices. 

とあるので、チェックボックスでチェックした値は配列になっているようです。

これを使って[“選択肢A”, “選択肢B”, “選択肢C”]の形式にするとできるような気がします。

"<フィールドコード>": {
    "value": [
        "選択肢1",
        "選択肢2"
    ]
}

上記になれば良いので、

Utilities.formatString(',"cand_work_place" : { "value": %s }',JSON.stringify(itemResponse.getResponse()))

こんな感じでしょうか。

Yoshidaさん

アドバイスありがとうございます!!

 

実は先日、kintoneの試用期間が終了してしまいまして…

試用期限直前に、仕方がないので一時的にチェックボックスからラジオボタンとして

登録してしまった関係で、頂いたアドバイスを今すぐに試すことができませんが、、

 

kintoneへの本登録後、上記試してみたいと思います!!

取り急ぎ、お礼まで。