GASとOutgoing WebhookでSlackのbotを作った時に引っかかった部分

GAS(Google Apps Script)とSlackのOutgoing WebhookでSlackのbotを作ってみました。

はじめに

もともとはRustで書いたものを動かすつもりでしたが、どこにデプロイするかという問題にぶち当たりました。

お金も出したくないので無料でSlack botを作れないかと思って調べたところ、GASに行き当たりました。

参考にしたのは
Slack BotをGASでいい感じで書くためのライブラリを作った - Qiita
です。

どんなものができたか

内容

「突然のほにゃらら」に反応して、吹き出し化するbot。以上。

動作

f:id:sorenuts:20190612110249p:plain
できたもの

ソース

ぶち当たったところ

環境変数の扱い方

参考サイトを見てみると、

var prop = PropertiesService.getScriptProperties().getProperties();
prop.token

APIキーを環境変数から取り出しているみたいなのだけど、上手く動作しない。
なので

 var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');

で直接取り出した。

Slackのスタンプの扱い

Slackのスタンプは

:hoge:

といった感じにコロンでくくられているのだが、そのままこれを受け取って文字列の長さをlength()で出してしまうと、スタンプで1文字なのに、コロン2つと中の文字を合わせて6文字扱いになってしまう。

こんな感じで吹き出しのサイズがおかしくなる。

f:id:sorenuts:20190612203723p:plain
変更前はこうだった

そこで文字列の長さを測る関数を別に用意した。
コロンからコロンまでを無視し、対応するコロンがない場合については巻き戻して文字列を数える関数である。

2バイト文字を2文字として数える関数にこの機能を盛り込んでおいた。半角と全角だと文字幅が違うからね。

URLエンコード

上と関連した話として、GASに飛んでくる文字はURLエンコードで飛んでくるみたいで、ASCII文字の記号は%xx形式になっている。

だから、コロンをそのまま判定しようとして

if ( text.charAt(i) == ':'){hogehoge}

としようとしても無駄である。

コロンの場合は"%3A"になるので、切り出すか、%に当たった場合に記号として判別するかした方がよい。

GASの更新

書いたスクリプトが反映されたりされなかったりして悩んだ。
「公開→ウェブアプリケーションとして導入」の後に、プロジェクトバージョンを最新にして更新しておかないとダメみたい。要検証。

おわりに

GASとかいう便利なものがあるとは知らなかった。思わぬ収穫。

botについては吹き出しの下側もサイズをきちんとしておきたい。そのうち。