前回の記事では、GASを使ってGoogle フォームで入力された回答をそのままkintoneアプリのレコードとして追加する方法を紹介しましたが、今回はその続きで、Google フォームからアップされた添付ファイル(質問の種類:ファイルのアップロード先)にも対応させようと思います。
kintoneアプリの設定とAPIトークンの取得
前回の記事で作成したkintoneアプリに、「添付ファイル」パーツ(フィールドコード:添付ファイル)を追加します。
APIトークンも前回の記事と同じ手順で取得しておきます。
Google フォームの設定
こちらも前回の記事と同じフォームを使い、「添付ファイル」(ファイルのアップロード先)項目を追加します。
今回はとりあえず、ファイルの最大数を「1」としておきます。
添付ファイルを含めてkintoneアプリにレコード追加するスクリプト
次は肝心なコードです。
APIトークンの保存場所やトリガーについては、前回の記事をご参照ください。
function onFormSubmit(e) {
var api_url = "https://(サブドメイン).cybozu.com/k/v1/record.json";
var api_token = PropertiesService.getScriptProperties().getProperty("Cybozu-API-Token");
var app_id = (kintoneのアプリID);
var fileKey;
var mail_to = (通知メール宛先アドレス);
var mail_body, mail_subject;
//通知メール内容設定
mail_body = "日時:" + Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm:ss") + "\n\n";
mail_body += "<<< フォーム回答内容 >>>\n";
//fileKey取得
e.response.getItemResponses().forEach(function(res) {
if(res.getItem().getType() == "FILE_UPLOAD") {
fileKey = uploadFile(res.getResponse(), api_token);
}
});
if(typeof fileKey !== 'undefined') {
//JSON設定
var dat = {
"app": null,
"record": {
"氏名": {"value": null},
"メールアドレス": {"value": null},
"性別": {"value": null},
"自己アピール": {"value": null},
"添付ファイル": {
"value": [
{
"fileKey": null
}
]
}
}
};
dat.app = app_id;
e.response.getItemResponses().forEach(function(res) {
var s = res.getItem().getTitle();
if(res.getItem().getType() == "FILE_UPLOAD") {
var v = DriveApp.getFileById(res.getResponse()).getName();
dat.record[s].value[0].fileKey = fileKey;
} else {
var v = res.getResponse();
dat.record[s].value = v;
}
mail_body += s + ":" + v + "\n";
});
//kintone API呼び出し(レコード登録)
var options = {
"method": "post",
"contentType": "application/json",
"headers": {
"X-Cybozu-API-Token": api_token
},
"payload": JSON.stringify(dat)
};
try {
var res = UrlFetchApp.fetch(api_url, options);
if(res.getResponseCode() === 200) {
mail_subject = "【通知】新着回答";
} else {
mail_subject = "【通知】回答失敗";
}
} catch(e) {
mail_subject = "【通知】エラー発生";
}
} else {
mail_subject = "【通知】アップロード失敗";
}
GmailApp.sendEmail(mail_to, mail_subject, mail_body); //通知メール送信
}
function uploadFile(fileID, api_token) {
var api_url = "https://(サブドメイン).cybozu.com/k/v1/file.json";
var boundary = "GoogleFormsTokintone";
var f = DriveApp.getFileById(fileID);
var data = "";
data += "--" + boundary + "\r\n";
//data += "Content-Disposition: form-data; name=\"file\"; filename=\"" + encodeURIComponent(f.getName()) + "\"\r\n";
data += "Content-Disposition: form-data; name=\"file\"; filename=\"" + f.getName() + "\"\r\n";
data += "Content-Type:" + f.getMimeType() + "\r\n\r\n";
var payload = Utilities.newBlob(data).getBytes()
.concat(f.getBlob().getBytes())
.concat(Utilities.newBlob("\r\n--" + boundary + "--").getBytes());
var options = {
"method": "post",
"contentType": "multipart/form-data; boundary=" + boundary,
"headers": {
"X-Cybozu-API-Token": api_token
},
"payload": payload
};
try {
var res = UrlFetchApp.fetch(api_url, options);
if(res.getResponseCode() === 200) {
var json = JSON.parse(res.getContentText());
return json.fileKey;
}
} catch(e) {
}
}
kintone REST APIの仕様により、ファイルアップロードAPIの実行結果として返ってくるファイルキーを、レコードの登録APIやレコードの更新APIに渡す必要があるため、上記コードでも、まず最初に「uploadFile」でファイルのアップロードを行っています。
ちなみに、アップロード時のリクエストヘッダの作成は下記サイトのコードを参考にしました。
動作確認
Google Apps Scriptの設定が終わったところで動作確認をしてみると、問題が無ければ、添付ファイル付きでkintoneアプリにレコード追加されているはずです。
ファイル名の末尾にアップしたユーザー名が付与されているのは仕様のようです。
以上のように、多少の手間は掛かりますが、Google フォームからGoogle ドライブを経由して、kintoneアプリに添付ファイルを追加することができます。
ただし、Google フォームで「ファイルのアップロード先」項目を追加したときに表示される下記メッセージの通り、回答する際にはGoogleへのログインが必要となるため、フォームの使いどころは汎用的ではなくなってしまいます。
ファイルはフォームのオーナーの Google ドライブにアップロードされます。ファイルをアップロードする形式の質問をフォームに追加すると、回答者は Google へのログインを求められます。このフォームは信頼できる相手とだけ共有するようにしてください。
ですが、上記コードを流用すれば、Google ドライブにあるファイルを簡単にkintoneに追加することができるため、“トリガーを使って定期的にGoogle ドライブのファイルをkintoneアプリに追加する”、といったこともできます。
Google Apps Scriptとkintoneアプリの連携の幅は非常に広いので、皆さんも是非お試しください。


























この記事へのコメントはありません。