見出し画像

Slackの投稿をGASで取込めないとき

Slackの投稿をWebhook、GAS(Google Apps Script)を用いて、スプレッドシートに取り込みたい…けど何故かうまくいかない方向けに、解決のヒントになれば幸いです。
(2023年10月5日時点)


はじめに

Slackの投稿を取込みたいという欲求は人類の過半がもっているようで、Google検索すればいろいろな方法が出てきます。

結論から言ってしまえば、こちらの方のサイトの通りにやればできます!

ですが、人間どうしてもミスをしてしまい、うまく動かない場合が出てきます。私もそうでした。
そうすると途端に難易度があがります。なぜなら、エラーメッセージが出ない(出し方を知らない)ので何を間違えているのかわからないのです。
私の場合、最初にコードを間違えていて、修正したものの、その後に再デプロイが必要と気づかずに延々悩みました…。そして、そんな初歩的な問題解決法を載せているサイトもなかったので、ここに陥りやすそうなミスと、どこが問題なのか探すヒントを残せればと思います。

  • 上のサイト通りにはとりあえず設定できた(はずの)方向け

  • GASのコードは上のサイトをコピペしている

  • 途中で出た警告はすべて承認してアクセス権限は問題ない

  • 一度、GASエディタ上で実行、あるいはデバックを行っている(その時エラーが出ると思いますが、それは無視して大丈夫です)

  • 筆者は素人ですので、内容に責任は負えません。

以上の前提で進めます。

ざっくりとした仕組み

まず、私の整理もかねて本件の仕組みを整理します。
トラブルシューティングに向かいたい方は飛ばしてください。
とりあえず動かせたけど仕組みが気になる人は少しお付き合いください。

Slack→Webhook→GAS(WEBアプリ)

まず、当然ですがSlackからスプレッドシートに直接データを飛ばすような機能は(現状)ありません。なので、①Slackに投稿があったことを認識し、②その内容を取り出す(発信する)仕組みが必要です。
それを担ってくれるのがOutgoingWebhookです。Slack内で起動するアプリ(カスタムインテグレーション)という形で提供されています。
インテグレーションの設定項目はいくつかありますが今回必要なのは

  • チャンネル

  • URL

  • トークン(自動生成されている)

です。OutgoingWebhookは、指定された「チャンネル」内で投稿があると、指定された「URL」へ「トークン」と一緒に、投稿の内容を送ってくれます。
トークンは、データを受領した側で、どのOutgoingWebhookからデータが来たのか?を識別するためにあるものだと思います。(試していませんが、GASの中からvar token とifのコードをなくしても、動くは動くと思います。)
ちなみにこのデータはJSONという形式になっているので、違うサイトだとコードにJSONという言葉が出てきて混乱する要因だと思いますが、気にしなくて大丈夫です。(23.10.18追記:JSONではなく、URL encodeみたいです。incoming web hookがJSONなので思い込んでました)
気になる方は、if文を少し変えると、送られたデータが全部わかります。

    if (token == e.parameter.token){
        var datetime = new Date();
        var date = (datetime.getFullYear() + '/' + ('0' + (datetime.getMonth() + 1)).slice(-2) + '/' + ('0' + datetime.getDate()).slice(-2))
        var time = (('0' + datetime.getHours()).slice(-2) + ':' + ('0' + datetime.getMinutes()).slice(-2));
        var username = e.parameter.user_name;
        var text = e.parameter.text;
        var value = e;

        array = [date,time,username,text,value];
        sheet.appendRow(array);
    }

さて、話を戻すと、「チャンネル」は自分が指定したいチャンネルを記載すればいいとわかりますが、「URL」とはなんでしょう?
これは単純に「データを送りたい先」だと思いましょう。当然、どこでもいいわけではなくて、「データを受け取ったら、スプレッドシートに入力してくれる先」ではなくてはいけません。
それを可能としてくれるのがGASです。

GAS(WEBアプリ)→スプレッドシート

GASは単にgoogleの機能を記述すれば自動で動作してくれるもの…だと思っていましたが、なんと、WEBアプリも立ち上げてくれることがわかりました。
最初、あまりに簡単すぎて気づきませんでしたが、「デプロイする」ということがWEBアプリとして立ち上げるということだったんですね。
通常、WEBアプリといえばサーバを用意して、プログラムをアップして…なんて作業が必要だと思っていましたが、こんな簡単になっているとは。
とにもかくにも、「データを受け取ったら、スプレッドシートに入力する」コードがGASで書ければ、あとは「デプロイ」することで、「データを受け取ったら、スプレッドシートに入力する」WEBアプリがインターネット上に公開され、OutgoingWebhookのデータの送り先になるわけです。

トラブルシューティング

では本題で、なぜ動かないのか?可能性を考えていきます。
偉そうに言っていますがほとんど私が実際に間違えていたものです。

GASまでの連携はできているのかどうか

まずはここが分岐点になると思います。これは確認する方法があって、GASのエディタの左側に「実行数」というメニューがあるので開いてみてください。

実行数の画面

ここで、対象のチャンネルに投稿した時間に、「関数:doPost」、「種類:WEBアプリ」のログがあれば、「ステータス:失敗しました」でも、データは届いてます。つまり、Webhook、デプロイまでは問題がないであろうことがわかります。
(キャプチャ上のdoGet:失敗しましたはWEBアプリのURLを直接ブラウザに入れるとなります。気にしないでください。)

連携ができていない場合

投稿してもうんともすんともな場合は、連携を見直していきましょう。

  • OutgoingWebhookはきちんと導入されているか?→ワークスペース名をクリック→その他管理項目→アプリを管理から導入済みのアプリ一覧が見れます。その中に「自分が」入れたWebhookはありますか?

  • Webhookのチャンネル名は正しく設定されていますか?似た名前の違うチャンネルではないですか?

  • WebhookのURLは正しく設定されていますか?再デプロイした場合、WEBアプリのURLが変わっていることがあります。

  • Webhookのトークンは正しくGASのコードに記載されていますか?(間違っていても連携には影響がないはずですが)

  • Webhookの設定変更後、保存をしていますか?

連携はできている場合

連携はできている場合は、あとはコードの問題です…と言いたいですが、もう一度言います。
「コードを保存後、再デプロイ」していますか?
私はこれで数時間…
再デプロイする場合は、「デプロイを管理」から、既存のデプロイを「編集」し、バージョンを「新しいバージョン」に変更すれば、URLも変わりません。「新しくデプロイ」すると新しいURLになり、既存のものと2つアクティブになりややこしいので気を付けてください。
コードの注意点は、

  • スプレッドシートの「シート名」が正しく入っていない→私は間違えて「ファイル名」を入れていました。

  • 3行目、var token =でWebhookで示されたトークンを入れていない 「自分の」Webhookで示されたトークンじゃないとだめですよ! あるいは不要な空白が入ってしまっている シングルクォーテーションが消えてしまっている等

と、実はこれくらいしかないです。おそらく沼にハマってしまっている人は、私のようにコード修正後の再デプロイができていないか、コード以外に理由があったのにコードを修正してしまい、どこに問題があるかわからなくなってしまっているのかと思います。
コードは、コピペしてシート名とトークンを正しく置き換えれば大丈夫なはずです。GAS上でそのまま実行ボタンを押すと、必ずエラーになるので(本来Webhookからデータを受け取って動作するコードなので、doPost(e)が空っぽですよ!となる)、そこで焦ってほかのサイトやchatGPTを参考に修正すると逆に遠ざかるかもしれません。
なお、コピペするとvar tokenの行の最後に「 ; 」がないですが、なくても動くらしいです(文法的には必要なので、いれても当然動きます)。

あとはその他の可能性として、「スプレッドシートとGASがそもそも連携してない」ということもあるのかな?スプレッドシート作成→拡張機能でGASを作りましたか?それぞれ別に作っているとこのコードでは動かないかもしれません。

連携できていれば上のようなアイコンになると思います。

つらつら書きましたが少しでも参考になれば幸いです。
一旦動けば、あとはコードを改造してみる、自前のWEBアプリを動かしてみる、他のSlack用アプリを使ってみる等いろいろチャレンジできると思います。

#デジタルファーストキャンプ #D1C #デジタルな振る舞い #リスキリング


この記事が気に入ったらサポートをしてみませんか?