Google Apps Script関連

Google Apps Script に関するメモ

Google Form への投稿をフックしてSlackへ通知する

ポイント

  • Google Form の各フォームの作成画面からスクリプトエディタへ飛べる
  • 同じようなコードを多数書くのは面倒なので、複数のFormで共通的に使えるような運用を考える
    • 外部ライブラリ的な使い方をする

本体はこれだけ。 最初は複数のフォームから同一のスクリプトを参照すればよいと思ったのだが、GAS上では「コンテナ(=ここでは各フォーム)」という形で1対1の関係になっているみたいなので、入り口となるスクリプトはフォームの数だけ作る必要があるように見える。

function call(form) {
  GoogleFormParser.parse(form)
}

本体から呼び出す共通的なスクリプト。独立した新規スクリプトとして作成する。

やっていること

  • Formのタイトルを取得している(通知されたあとに区別するため)
  • 「質問」と「回答」それぞれを1つのテキストに結合している
  • Parserと言いつつも最後に Slack へ通知する処理も書いている
const CHANNEL = "#google";

function parse(form) {
  const formTitle = form.source.getTitle();
  const itemResponses = form.response.getItemResponses();
  const answers = [];

  for(let i = 0; i < itemResponses.length; i++) {
    const question = itemResponses[i].getItem().getTitle();
    const answer = itemResponses[i].getResponse();

    if(!answer) {
      answers.push(question + ": 空欄");
    } else {
      answers.push("*" + question + "*: " + answer + "\n");
    }
  }

  const body = ":wave: *Inquiry received* ("+ formTitle +"): \n"
           + "\n"
           + answers.join("\n");

  slack(body);
}

function slack(body) {
  PostSlack.sendMessage(body, CHANNEL);
}

Slackへ通知する責務を担う共通スクリプト。これも独立した新規スクリプトとして作成する。

  • レガシーな Incomming Webhook ではなく、 Slack App としての実装
    • SLACK_BOT_TOKEN としてトークンを事前にセットしておく(環境変数的に)。
    • 気にならないならハードコードしてもよい。
const token = PropertiesService.getScriptProperties().getProperty("SLACK_BOT_TOKEN");

// こちらは直接呼び出さない。private的な処理
function callWebApi(apiMethod, payload) {
  const response = UrlFetchApp.fetch(
    `https://www.slack.com/api/${apiMethod}`,
    {
      method: "post",
      contentType: "application/x-www-form-urlencoded",
      headers: { "Authorization": `Bearer ${token}` },
      payload: payload,
    }
  );
  console.log(`Web API (${apiMethod}) response: ${response}`)
  return response;
}

// こちらの関数の呼び出しを期待している
function sendMessage(textMessage, channel) {
  if (!channel) {
    // チャンネル指定がない場合のデフォルト指定。適当に変更して構わない。
    channel = "#general";
  }

  callWebApi("chat.postMessage", {
    text: textMessage,
    channel: channel
  });
}

ライブラリ的な使い方は以下の記事でも触れているので参考に(この記事では、NotionへPostするためのライブラリ的な活用)

【Notionの活用例】Google Apps Script でメルマガを Notion に送る(スクリプト例)
【Notionの活用例】Google Apps Script でメルマガを Notion に送る(スクリプト例)
https://fand.jp/notion/google-apps-script-with-magazine-example/
Google Apps Script を使って Notion にメルマガを集約するためのスクリプト実装例を紹介します。

参考情報