Google関連

[Google Apps Script]Google フォームとkintoneを連携させる方法(添付ファイル編)

前回の記事では、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アプリの連携の幅は非常に広いので、皆さんも是非お試しください。

関連記事

  1. Microsoft Graph

    [Google Apps Script]Microsoft Graph APIを使ってMicroso…

    Microsoft Graph APIを使って、OneDriveにある…

  2. Google関連

    [Google Apps Script]認証が必要なウェブアプリケーションを外部から実行する

    Google Apps Scriptでは、作成したコードをウェブアプリ…

  3. Google関連

    [Google Apps Script]insertTextBoxメソッドでスライドにテキストボック…

    昨年の9月にスライド上にテキストボックスを挿入するスクリプトについて記…

  4. Office関連

    OneNote + Google Apps Scriptで定期的にWebサイトのキャプチャーを撮る方…

    「“OneNote”がアップデート、URLをメールで送るだけでスクリー…

コメント

  • コメント (0)

  • トラックバックは利用できません。

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP