プログラムのメモ

JSとかAPIとか諸々のメモ

slash commandの3秒ルールをどうにかする。

SlackApiで作成できるslash commandではレスポンスを3秒以内に返さないとタイムアウトしてしまうが、GASをサーバとして使用する場合、この問題は相性が最悪だと思う。

そもそもGASは非同期処理を推奨していないようでsetTimeout系が全く使えない。
Lambdaの場合は、callbackでレスポンスだけ先に返すこともできるようだが、当然GASではそんなことできない。

そのため、リアルタイム処理で時間がかかりそうなものはcookieやcacheにキューとして保存して、別途定期実行で処理を行うやり方がググると出てくる。

ただ、GASの定期実行は最短が1分毎なので、リアルタイムで実行したい場合は厳しい。

その場合、コード内でイベントトリガーを作成して実行すると、限りなくリアルタイムに近い非同期処理が可能になる。

var d = new Date();
d.setMinutes(d.getMinutes() + 1);// 1 分後
ScriptApp.newTrigger("function_name").timeBased().at(d).create();

上記newTriggerを使用して時間指定でイベントを設定し、別途処理を行えば何とかなる。

追記 19/06/07

全然リアルタイムじゃなかったです。

newTrigger自体が発火までに最大15分ずれることがあるとのことなので、リアルタイムは難しい。

それと追加したトリガーは都度消さないとトリガーが貯まって怒られます。

var triggers = ScriptApp.getProjectTriggers();
for(var i=0; i < triggers.length; i++) {
  ScriptApp.deleteTrigger(triggers[i]);
}
  • 全てのトリガーを削除