やっぱりね、慣れないことは引き受けないのが一番です。とは言えやらないと出来るようにならないので、頑張りましょう。
環境について
Slack と スプレッドシートが使えます。
ワークフローも使えるのでプレミアム環境というやつでしょうか。
何を作るのか(仕様)
もともとワークフローで決められたフォームの内容を Slack に投稿スプレッドシートに記録する、というシンプルな構成で済ませたかったんですが、スレッドの返信も記録していきたかったのです。
- ワークフローからフォームの内容をシートに書き出す。
- 返信もシートに書き出す。
- 新規スレッドの書き出しはワークフローからのみ許容する。
- スレッドの ID も書き出す。
- 返信の ID も書き出す。
基本的な手順
- Google スプレッドシートにテンプレを作る。
- GAS (Google Apps Script) を開く。
まずここなんですよね、普通の人があまり手を付けないところ。未だに分かってませんがこの Apps Script はどこに保存されてるんだろう...。 - 先人のコードに敬意を払いコピペする。
https://qiita.com/COMUCAL/items/4d8dd1bb1614805bfb41
このコードではアクティブなシートに書き込むことになっているので目的に合わない。URLに対応させる。const SHEET = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/xxxxxxxxxxx/edit').getSheetByName('シート1');
- slack app directory で Outgoing Webhook をカスタムインテグレーションで設定する。
ここでトークンをゲットし、GAS のコードにコピペする。 - GAS をデプロイする。
WEBアプリ、自分で実行することにする、全員アクセスできることとする。
この URL を Outgoing Webhook に反映する。 - Outgoing Webhook のチャンネルを目的のチャンネルに設定する。
- 設定を保存する。
この時点でチャンネルの投稿が書き込まれるようになります。
あとはワークフローをぼちぼち適当に設定したわけです。
つまづきポイント
Outgoing Webhook のチャンネル設定にチャンネルが出てこない!?
これは最近ありがちな気がします。「検索すればいいじゃない」的構造なんですよね、たぶん。アイテムはありません
ってなんやねん!?
この対応はずばり手入力です。すると何故か途中から候補に出てきます。だったら最初から手入力っぽくしておいてくれればよいのに。
Outgoing Webhook のリファレンスはどこだよ...
いろいろなサービスやら言語も含めてなんですが、見るべきリファレンスが見つからないんですよね。
Outgoing Webhook が doPost に渡す引数の正体が JSON ではない
こちらで知りました。JSON も普段は使わないので困りましたが、そもそも JSON でもなく URL encode だとか。それもそれで分からないのですが、調べ方が違うというのは重要なポイントですね。
Slack のワークフローで使える変数定数等がさっぱりわからん
thread_ts に相当する値をスプレッドシートに書き込みたいわけです。そのやり方がさっぱり見つからない。きっと出来ると思うんですが。
結局スプレッドシートのシート関数とURLを組み合わせて ID を表示するという技を使うことにしました。
GAS のデプロイでアクセスできる範囲を間違えた
セキュリティ観点からなるべくアクセス範囲を絞ろうという癖がありまして。先人の遺した資料には「全員」と書いてあるにも関わらず、「全員」ではないところを選んでしまいました。
コード更新→デプロイの手順が怪しい
ちまちまコードの不具合を修正して「デプロイの管理」「編集」「デプロイ」で更新していましたが、上手くいっている気がしませんでした。途中からバージョンを増やしつつデプロイするようにしたところ何だか良さげになりまして。
でもそれをやるとアーカイブのところにどんどんゴミが貯まるんですよね。汚い…
あとがき
とりあえずやってみよう、というのは大事なことです。それに伴う学びは大きい。
しかしのんびり学んでいる時間も多くはありません。私が苦戦した部分を残しておくことで、誰かの苦戦が…
減ることも無いのでしょうね、自己満足の世界です。