【GAS】Googleフォームに回答されたらChatworkに通知する

Googleフォームをよく使う現場では、外部ツールとの連携がしたくなるケースがしばしばあると思います。

今回はその中でもよくあるケースのひとつであろう、Chatwork通知の手順をまとめました。

目次

全体の流れ

今回の実装におけるおおまかな手順は以下のとおりです。

  1. ChatworkのAPIトークンを取得する
  2. 通知先のChatworkルームIDを取得する
  3. Googleフォームを作成する
  4. GASでChatworkへの通知スクリプトを書く
  5. Googleフォーム回答で発火するトリガーを設定する

いずれも比較的容易に実装できるものなので、お試しください。

注意書き: ChatworkのIP制限について

会社によってはセキュリティの都合でChatworkにIP制限をかけている場合があります。

その場合、GASから実行する際にエラーとなってしまうため別途対応が必要です。

たとえば

  • IPアドレスを固定にできる環境からスクリプトを実行する
  • IP制限を適用しないアカウントに紐づくAPIトークンを取得する

私が業務させていただいている会社では後者を選択し、IP制限が適用されない開発用アカウントに紐づくAPIトークンを使用しています。

この辺りは現場単位のポリシーで変わるかと思いますので、ご検討ください。

今回はIP制限が無い環境である前提で手順を記載します。あしからず。

ChatworkのAPIトークンを取得する

まずはChatworkに投稿するため、APIトークンを取得します。

PCブラウザ上での想定で手順を記載します。

[ 右上のアイコンとアカウント名が書かれている箇所 ] > [ サービス連携 ] で開かれた画面の左メニューに「APIトークン」という欄があるので、そこで取得します。

APIトークン取得画面

公式ガイドにも記載されていますので、不明点がある方はご確認ください。

公式ガイド

通知先のChatworkルームIDを取得する

当然ではありますが、通知するには通知先がわからないといけません。

ルームIDは、処理の中で「どこに通知を投稿するか」を示すのに必要です。

簡単にルームIDを取得するなら、ブラウザでChatworkにログインし、通知させたいルームを開くことです。

URLを確認すると、以下の形式になっているかと思います。

https://www.chatwork.com/#!rid[数値]

ここに記載されている、数値の箇所がルームIDです。

この後に使うので、値を控えておきましょう。

注意点としては、APIトークンに紐づくアカウントが投稿権限を持っているChatworkルームに限ります。

Googleフォームを作成する

今度はGoogleフォームを作成します。

ここでポイントとなるのが、「質問の文言は重複させないこと」です。

たとえばご紹介フォームを作成し、紹介者の名前と被紹介者の名前を入力するとします。

その時「紹介者」セクションの「氏名」と、「被紹介者」セクションの「氏名」という形で作ってしまうと、GASでどっちがどっちの「氏名」かを判定できず、期待せぬ動作をしてしまう可能性があります。

こういうケースでは「紹介者氏名」「被紹介者氏名」など、どこの質問かが一意に定まるようなテキストにしましょう。

また、回答順に取得する処理も作れるのですが、分岐や任意回答の箇所でズレてしまう仕様なので処理としては信頼できません。

このあたりに気をつけておけば、あとは普通にフォームを作ればOKです。

【ほぼコピペ】GASでChatworkへの通知スクリプトを書く

ここで肝心のGASを書いていきましょう。

まずはGoogleフォームに紐づいたスクリプトエディタを立ち上げます。

Googleフォーム編集画面の右上にある三点をクリックして、「スクリプトエディタ」を選択してください。

以下のような画面が開ければOKです。

とは言っても大体コピペで大丈夫です。以下のコードを参考にしてください。

const CHATWORK_TOKEN = '' //ここにChatworkで取得したAPIトークンを入れる
const CHATWORK_ROOM_ID = '' //ここにChatworkで取得したルームIDを入れる

function onFormSubmit(e) {
    const itemResponses = e.response.getItemResponses(); //Googleフォームの回答を取得
    let message = '[toall]Googleフォームに回答がありました\n' //Chatworkに送るメッセージを格納する変数

    message += '[info]'
    //質問と回答を取得する
    for (var i = 0; i < itemResponses.length; i++) {
        let itemResponse = itemResponses[i];
        let question = itemResponse.getItem().getTitle(); //質問を取得
        let answer = itemResponse.getResponse(); //回答を取得
        message += `${question}: ${answer}\n`
    }
    message += '[/info]'

    postToChatwork(message)
}

function postToChatwork(message) {
    let url = `https://api.chatwork.com/v2/rooms/${CHATWORK_ROOM_ID}/messages`
    let headers = {
      "accept": "application/json",
      "content-type": "application/x-www-form-urlencoded",
      "x-chatworktoken": CHATWORK_TOKEN
    }
    let options = {
      "method": "POST",
      "headers": headers,
      "payload": { "body": message }
    }

    var res = UrlFetchApp.fetch(url, options);
    console.log("--postToChatwork res: %s", res.getResponseCode());
    return res;
}

あとは、最初の2行の”の中にChatworkのAPIトークンとルームIDを入力すれば、通知スクリプトの完成です。

本当はAPIトークンなどはスクリプトプロパティ等に保存するべきなんですが、主旨とは異なるので割愛します。

Googleフォーム回答で発火するトリガーを設定する

最後に、Googleフォームが回答されたら、上記のスクリプトが動き出すように設定します。

スクリプトエディタ画面の左側にある時計マークをクリックして、トリガー設定をしましょう。

右下にある[+トリガーを追加]ボタンを押すと、トリガー設定ができます。

設定内容は以下のとおり

  • 実行する関数を選択: onFormSubmit(functoin名を変更した場合はその関数名)
  • 実行するデプロイを選択: Head
  • イベントのソースを選択: フォームから
  • イベントの種類を選択: 起動時
  • エラー通知設定: どれでもOK

これで保存すれば、完成です!

実際にGoogleフォームの回答をしてみて、ちゃんと通知されるか確認してみてくださいね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内Edtech企業のコーポレートエンジニア。
業務改善・自動化についての開発をしています。
エンジニア歴9年、コーポレートエンジニア歴4年。

目次