時刻指定のトリガーで指定の時刻にメッセージを投稿するスクリプトの参考例です。
サンプルでは直接日時とメッセージを指定していますが、
コメントに記載のようにスプレッドシートから設定を読み込むことも可能です。
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}
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/06/19 02:49
2023/06/19 03:42