GPTとのやりとりをGoogle App Scriptを経由してSlack Botで行おうと思ったら,ドツボにハマった話をメモ.
課題:
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)
]);
}参考
課題: なぜか1度のメッセージ送信に対して複数回のトリガが発生する問題
解決: 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のEvents APIのリクエストをGASで処理するときに複数回実行される問題(3秒のタイムアウト)の対策 - Qiita
- slack api Document
- リトライされたリクエストの場合ヘッダに
X-Slack-Retry-NumがついてくるがGASではヘッダ検証できない
- リトライされたリクエストの場合ヘッダに