実現したいこと
- GAS経由で、自分のSlackチャンネル(ダイレクトメッセージ)にメッセージを通知したい。
前提(試したこと)
以下「該当のソースコード」を実行した際、プライベートチャンネル(複数人が参加するch.)への投稿は成功するのですが、
自分自身へのダイレクトメッセージへの投稿は失敗してしまいます。
発生している問題・エラーメッセージ
'token': BOT_TOKEN,
'channel': CHANNEL_ID,
※CHANNEL_IDをDMのIDに変更すると以下エラーが出て失敗します。プライベートチャンネルのIDだとチャンネル投稿が成功します。
Exception: Invalid argument: value
該当のソースコード
JavaScript
1//日時を指定してslackにメッセージを投稿 2function test() { 3 //スプレッドシートのセルの値から設定するときの例 4 // const sheet = SpreadsheetApp.getActiveSheet(); 5 // const values = sheet.getRange('B2:D4').getDisplayValues(); 6 // const e = {'messages': values}; 7 const e = { 8 'messages': [//[日付, 時刻, 投稿メッセージ] 9 ['2023/06/19', '14:30', '初回の投稿メッセージ'], 10 ['2023/06/19', '14:50', '1回目の返信のメッセージ'], 11 ['2023/06/19', '14:55', '2回目の返信のメッセージ'], 12 ] 13 }; 14 postToSlack(e); 15} 16//指定の日時に指定のメッセージを同じスレッドで投稿 17function postToSlack(e) { 18 //プロパティサービスを利用開始 19 const prop = PropertiesService.getScriptProperties(); 20 //この関数を直接実行した場合は、トリガーと設定値を初期化 21 if (e === undefined) { 22 prop.deleteAllProperties(); 23 const triggers = ScriptApp.getProjectTriggers(); 24 for (const trigger of triggers) { 25 if (trigger.getHandlerFunction() == 'postToSlack') { 26 ScriptApp.deleteTrigger(trigger); 27 } 28 } 29 console.log('トリガー及び保存した値を初期化しました。'); 30 return; 31 } 32 //初回の実行とトリガーによる実行で処理を分ける 33 if (e.triggerUid) {//トリガーによる実行のとき 34 //メッセージを一つずつ取り出して投稿 35 const url = 'https://slack.com/api/chat.postMessage'; 36 const payload = { 37 'token': BOT_TOKEN, 38 'channel': CHANNEL_ID, 39 }; 40 const thread_ts = prop.getProperty('thread_ts'); 41 if (thread_ts) {//返信の投稿ならタイムスタンプを追記 42 payload.thread_ts = thread_ts; 43 } 44 const messages = JSON.parse(prop.getProperty('messages')); 45 payload.text = messages.shift();//メッセージを一つ取り出す 46 if (messages.length > 0) {//メッセージ残っていれば保存 47 prop.setProperty('messages', JSON.stringify(messages)); 48 } else { 49 prop.deleteAllProperties(); 50 } 51 const params = { 52 'method': 'post', 53 'payload': payload 54 }; 55 const response = UrlFetchApp.fetch(url, params); 56 const dates = JSON.parse(response.getContentText()); 57 if (!thread_ts) {//初回の投稿のときの処理 58 //タイムスタンプを保存 59 prop.setProperty('thread_ts', dates.ts); 60 } 61 //トリガーを削除 62 const triggers = ScriptApp.getProjectTriggers(); 63 for (const trigger of triggers) { 64 if (trigger.getUniqueId() == e.triggerUid) { 65 ScriptApp.deleteTrigger(trigger); 66 break; 67 } 68 } 69 } else {//トリガーによる実行ではない初回の実行のとき 70 //メッセージ保存とトリガー設定 71 prop.deleteAllProperties(); 72 const messages = e.messages.map(v => [new Date(v[0] + ' ' + v[1]), v[2]]); 73 messages.sort((a, b) => a[0].getTime() - b[0].getTime()); 74 messages.forEach(message => { 75 ScriptApp.newTrigger('postToSlack') 76 .timeBased() 77 .at(message[0]) 78 .create(); 79 message.shift();//配列要素から日時を除去 80 }); 81 prop.setProperty('messages', JSON.stringify(messages.flat())); 82 } 83}
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー