🕶️

Google Formsを使ってSlackに匿名で投稿

2020/10/28に公開

はじめに

参考文献

基本的には以下のページを参考にさせていただき、作成しました。ありがとうございます。
Slackで初歩的な質問ができるチャンネルを作ったら大反響だった話
途中引っかかった点や追加した要素が幾つかあったため、上記ページをなぞりながら備忘録的に改めて記述していきます。

あえてSlack内で完結させないことのメリット

(おそらくGoogle Formsを使わずに実装する方法もあるんだろうな、と思い書いておきます)

  • Google Formsが比較的分かりやすい匿名性を持っているため、匿名であることが理解しやすい
  • ブラウザから入力するため、操作を誤って個人のアカウントで投稿してしまう心配がない

→Slackライトユーザーな人にも安心して利用してもらえる!はず

注意

Googleアカウントの設定言語は予め英語にしておくことをお勧めします。
対処方法のはっきりしないエラーに私も長らく苦戦しました。
GAS で「一部のスコープへのアクセス権限がありません」と怒られたときの対処法

手順

匿名投稿

まずGoogleフォームを作成していきます。各質問のタイトルは後にスクリプト上で判定ワードとして利用することになるため、変える場合はセットで変えるようにしてください。
匿名投稿_menu.jpg

フォームが完成したら、メニューからスクリプトエディタを起動します。
以下の様に記述します。

function sendToSlack(message, channel) {
  // 以下にIncomming WebHooks のURLを張り付ける
  var url = "https://hooks.slack.com/services/hogehoge...";
  
  var data = {
    "channel" : channel,
    "username" : "匿名くん",
    "text" : message,
    "icon_emoji" : ":hoge:"
  };
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  UrlFetchApp.fetch(url, options);
}

function onFormSubmit(e){
  var itemResponse = e.response.getItemResponses();
  for (var i = 0; i < itemResponse.length; i++){
    var title = itemResponse[i].getItem().getTitle();
    var postedMessage = itemResponse[i].getResponse();
    switch (title) {
      case "投稿先チャンネル名":
        channel = postedMessage;
        break;
      case "内容":
        message = postedMessage;
        break;
      default:
        break;
    };
  };
  
  // 以下に送信するチャンネル名を指定
  sendToSlack(message, channel);
}
  • Incoming WebHooksのURL取得方法は以下が参考になります。
    SlackのWebhook URL取得手順
    (Incoming WebHooks設定画面での投稿先チャンネルの指定は、今回のスクリプトでは全く関係しないので特別悩む必要はありません。)
  • usernameやicon_emojiは自由に設定してください。

プロジェクト名に適当に名前を付け、保存します。
上部メニューから「Edit > Current project's triggers」を選択してG Suite Developer Hubを開き、Add Triggerでトリガを追加します。
trigger.jpg

トリガを追加する際に認証画面が表示されるかと思います。
前項にも記載しましたが、設定言語を日本語にしているとこれが上手くいかず、エラーに悩まされる場合があります。(そのうちGoogleさんがアップデートしてくれて解決するかもしれません)

トリガの設定を終えたら実装完了です。
実際に投稿するとこんな感じになります。
匿名投稿例.jpg

匿名リプライ

基本的な流れは匿名投稿の場合と同様です。
まずフォームを作ります。
匿名リプライ_menu.jpg

スクリプトエディタを起動し、以下を記述します。

function sendSlack(link, answer, token) {
  var slackApp = SlackApp.create(token);
  var channelId = link.split("/")[4];
  var rawTimestamp = link.split("/")[5].slice(1);
  var commaIndex = rawTimestamp.length - 6;
  var timestamp = rawTimestamp.slice(0, commaIndex) + "." + rawTimestamp.slice(commaIndex);
  var options = {
    username: "匿名回答くん",
    thread_ts: timestamp
  };
  slackApp.postMessage(channelId, answer, options);
}

function onFormSubmit(e) {
  // 以下にSlackのAccess Tokenを貼り付ける
  var slackAccessToken = 'fugafuga...';
  var itemResponse = e.response.getItemResponses();
  for (var i = 0; i < itemResponse.length; i++){
    var title = itemResponse[i].getItem().getTitle();
    var postedMessage = itemResponse[i].getResponse();
    switch (title) {
      case "リプライする対象のURL":
        link = postedMessage;
        break;
      case "リプライ内容":
        answer = postedMessage;
        break;
      default:
        break;
    };
  };
  sendSlack(link, answer, slackAccessToken);
}
  • SlackAppを利用させていただいています。
    Slack BotをGASでいい感じで書くためのライブラリを作った
    「Resources > Libraries...」からライブラリを追加するのを忘れないようにしましょう。
  • SlackのOAuth Access Tokenというものが必要になります。
    Slack API 推奨Tokenについて
    今回必要になるPermissionは「Send messages as xxxx(作成したアプリ名)」です。
    また、作成したこのアプリのアイコンが匿名リプライのアイコンにもなりますので、必要に応じて設定しておきましょう。
  • usernameはお好みで。

あとはトリガを設定して、実装完了です。

こんな感じです。
匿名回答例.jpg

おことわり

本記事は技術ブログサービスQrunchのサービス終了に伴い移行したものです。
執筆時の日時は2019-02-04 18:04:12 +0900であり、記載内容は現在の状況と異なる可能性がありますのでご注意ください。

Discussion