LoginSignup
0
0

GPTとのやりとりをGoogle App Scriptを経由してSlack Botで行おうと思ったら,ドツボにハマった話をメモ.

GASのプリントアウト出力問題

課題:
Logger.logConsole.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_idcacheに蓄積し,一度送信した履歴があればスキップするよう実装する.

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ではヘッダ検証が大変そう
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0