GASとOutgoing WebhookでSlackのbotを作った時に引っかかった部分
GAS(Google Apps Script)とSlackのOutgoing WebhookでSlackのbotを作ってみました。
はじめに
もともとはRustで書いたものを動かすつもりでしたが、どこにデプロイするかという問題にぶち当たりました。
お金も出したくないので無料でSlack botを作れないかと思って調べたところ、GASに行き当たりました。
参考にしたのは
Slack BotをGASでいい感じで書くためのライブラリを作った - Qiita
です。
ぶち当たったところ
環境変数の扱い方
参考サイトを見てみると、
var prop = PropertiesService.getScriptProperties().getProperties();
prop.token
でAPIキーを環境変数から取り出しているみたいなのだけど、上手く動作しない。
なので
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
で直接取り出した。
Slackのスタンプの扱い
Slackのスタンプは
:hoge:
といった感じにコロンでくくられているのだが、そのままこれを受け取って文字列の長さをlength()で出してしまうと、スタンプで1文字なのに、コロン2つと中の文字を合わせて6文字扱いになってしまう。
こんな感じで吹き出しのサイズがおかしくなる。
そこで文字列の長さを測る関数を別に用意した。
コロンからコロンまでを無視し、対応するコロンがない場合については巻き戻して文字列を数える関数である。
2バイト文字を2文字として数える関数にこの機能を盛り込んでおいた。半角と全角だと文字幅が違うからね。
URLエンコード
上と関連した話として、GASに飛んでくる文字はURLエンコードで飛んでくるみたいで、ASCII文字の記号は%xx形式になっている。
だから、コロンをそのまま判定しようとして
if ( text.charAt(i) == ':'){hogehoge}
としようとしても無駄である。
コロンの場合は"%3A"になるので、切り出すか、%に当たった場合に記号として判別するかした方がよい。
GASの更新
書いたスクリプトが反映されたりされなかったりして悩んだ。
「公開→ウェブアプリケーションとして導入」の後に、プロジェクトバージョンを最新にして更新しておかないとダメみたい。要検証。