質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.41%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

1回答

801閲覧

GAS経由でSlackへの投稿と返信を時間指定して通知したい

thre

総合スコア7

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

2クリップ

投稿2023/06/15 04:03

実現したいこと

  • GAS経由でSlackBotに通知させる際、最初の「投稿」とスレッド内の「返信」をそれぞれ時間指定して通知したい 

前提

GASを使ってSlackに通知させる際、
単発で投稿させるだけではなく、一定時間経過後に返信も自動でさせることにより、
冒頭の投稿に対して、リマインダー的な役割を持たせたいと考えております。

例)会議開始の10分前に最初の「投稿」が行われ、開始5分前に「返信」という形で再通知させる

※以下コードの場合、「投稿」と「返信」が同時に通知されるため、
それぞれを任意の時間に指定して通知できないか試行中です。

該当のソースコード

function test(){ const thread_ts = postToSlack("投稿") postToSlack("返信", thread_ts); } // slack に post する function postToSlack(message, thread_ts=null) { var url = "https://slack.com/api/chat.postMessage"; var payload = { "token" : `${BOT_TOKEN}`, "channel" : `${CHANNEL_ID}`, "text" : `${message}` }; if(thread_ts){ payload["thread_ts"] = thread_ts; } var params = { "method" : "post", "payload" : payload }; // Slackに投稿する const response = UrlFetchApp.fetch(url, params); const dates = JSON.parse(response.getContentText('utf-8')); // thread_ts を返す return dates['ts']; }

参照)
https://zenn.dev/scnsh/articles/6791519a806463

補足情報

時間取得・指定については
new Date()ScriptApp.newTrigger を使用して実現可能とは思うのですが、
プログラムの知識がなく、「投稿」「返信」の分け方がわからない状態です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

時刻指定のトリガーで指定の時刻にメッセージを投稿するスクリプトの参考例です。
サンプルでは直接日時とメッセージを指定していますが、
コメントに記載のようにスプレッドシートから設定を読み込むことも可能です。

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 00:54

編集2023/06/19 01:09
YellowGreen

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thre

2023/06/19 02:49

ご回答誠にありがとうございます。 直接とスプレッドシート、どちらからでも時間指定投稿が行えることを確認いたしました。 実現したかった機能ですので、ありがたく活用させていただきます。
YellowGreen

2023/06/19 03:42

お役に立ててよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.41%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問