GPTとのやりとりをGoogle App Scriptを経由してSlack Botで行おうと思ったら,ドツボにハマった話をメモ.
GASのプリントアウト出力問題
課題:
Logger.log
やConsole.log
を行っても,doPost
関数はログを吐かない.
解決:
Spread Sheetにログを吐くようにメソッドを追加.Kotlinと同様のPrint形式を採用.
function sslog(tag, msg){
const sheetForLog = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheets()[0]; //sheetIDはとりあえず0
sheetForLog.appendRow([ // わかりやすいように1列目には現在の日時を書き込む
Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss'),
tag,
JSON.stringify(msg)
]);
}
参考
Slack多重トリガ問題
課題:
なぜか1度のメッセージ送信に対して複数回のトリガが発生する問題.
どうやらGPTの処理待ちの時間にSlackが再送を行っているような状況.
解決:
client_msg_id
をcache
に蓄積し,一度送信した履歴があればスキップするよう実装する.
if (slackEvent.event.client_msg_id == null) { // NULL
sslog("Retry", "Return; NULL");
return;
} else if (cache.get(slackEvent.event.client_msg_id) == 'done') { // キャッシュからの取得; get(キー)
sslog("Retry", "Return; client_msg_id is 'done'");
return;// ContentService.createTextOutput(); // 新しい TextOutput オブジェクトを作成
} else {
sslog("Retry", "Continue; This is First Time");
cache.put(slackEvent.event.client_msg_id, 'done', 600); // キャッシュへの追加; put(キー, 値, 保持期限(秒))
}
参考
-
slack api Document
- リトライされたリクエストの場合ヘッダに
X-Slack-Retry-Num
がついてくるらしいが,GASではヘッダ検証が大変そう
- リトライされたリクエストの場合ヘッダに