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

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

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

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

Slack

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

Q&A

解決済

1回答

733閲覧

SlackのDMにメッセージを投稿したい

thre

総合スコア7

Google Apps Script

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

Slack

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

0グッド

1クリップ

投稿2023/11/16 01:09

実現したいこと

  • 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/ツールのバージョンなど)

参照元)
https://teratail.com/questions/d39kx2dtfkfssk

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

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

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

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

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

YellowGreen

2023/11/19 15:27 編集

ご自身のDMのチャンネルに投稿するのであれば、 'token': xxxxxxxx をBotのトークンではなく、 Userのトークンにしてみてください。
thre

2023/11/20 02:16

ご回答ありがとうございます。 トークン設定を確認してみます。
thre

2023/11/27 06:32

ご指摘通り、BotからUserのトークンに変更したところ、DM投稿が成功いたしました。 ご回答誠にありがとうございました。
guest

回答1

0

ベストアンサー

自分のSlackチャンネル(ダイレクトメッセージ)は基本的にはできません。
アプリとのDMとなります。

投稿2023/11/17 08:29

macaron_xxx

総合スコア3191

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

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

thre

2023/11/20 02:15 編集

ご回答ありがとうございます。 tokenの設定で解決する可能性があるので確認してみます。
thre

2023/11/27 06:32

UserではなくBotのトークンを指定していたため、ご指摘通りダイレクトメッセージには送信できておりませんでした。 ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問