🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

Slack

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

Q&A

解決済

2回答

10791閲覧

GASからSlackのダイレクトメッセージを送りたい

SystemAjisai

総合スコア174

Google Apps Script

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

Slack

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

0グッド

0クリップ

投稿2018/09/04 02:53

前提・実現したいこと

GoogleAppsScriptを使ってSlackBotを作成しています。
やりたいのは、
0. どこかのチャンネルでボットに呼びかける
0. 呼びかけられたチャンネルに挨拶を返す
0. その後呼びかけた人に今日の予定をダイレクトメッセージで送信する

という内容です。

発生している問題・エラーメッセージ

1,2は成功していますが、3のところで呼びかけた本人ではなく、
slackbotにメッセージが通知されてしまいます。
これを呼びかけた本人に通知してほしいです。

イメージ説明

実装は、着信Webフックの設定ページ「セットアップ手順」の「チャンネルに上書きする」の

着信 Web フックにはデフォルトのチャンネルがありますが、JSONペイロードで上書きすることができます。パブリックチャンネルは "channel": "#other-channel"、ダイレクトメッセージは "channel": "@username" で指定できます。

を参照して作ったのにちゃんと動いてくれず、どうしていいかわからない状態です。

該当のソースコード

ネットで検索したらよく出てくるGoogleAppsScriptのSlackBotライブラリは使用してません。
Appディレクトリから追加した着信Webフック(Incoming Webhooks)と発信Webフック(Outgoing Webhooks)を使って実装しています。

javascript

1function doPost(e){ 2 var url = PropertiesService.getScriptProperties().getProperty('SLACK_POST_URL'); 3 var options = { 4 "method" : "POST", 5 "headers": {"Content-type": "application/json"}, 6 "payload" : JSON.stringify({ 7 text: "今日の予定", 8 channel: "@"+e.parameter.user_name 9 }) 10 }; 11 12 UrlFetchApp.fetch(url, options); 13 return null 14}

試したこと

■チャンネル表記を色々変えてみる
以下パターンも試してみました。

channelに渡すもの結果
"@" + e.parameter.user_nameslackbotに通知される
"@" + e.parameter.user_idslackbotに通知される
"<@" + e.parameter.user_name + ">"送信エラー
"<@" + e.parameter.user_id + ">"送信エラー
"#" + e.parameter.user_id送信エラー
"#" + e.parameter.user_name送信エラー
encodeURIComponent("@" + e.parameter.user_name)送信エラー
encodeURIComponent("@" + e.parameter.user_id)送信エラー

固定で私のユーザ名、ユーザIDも試しましたが、slackbotに通知されてしまいました。

■自作のSlackAPI経由で通知してみる
着信Webフックではなく自分でSlaskAPIを作って、IncomingWebhooksを設定して試してみました。
こちらの方法では設定したユーザにダイレクトメッセージが発行されましたが、
Webhook URLがユーザ毎で変わってしまうので切り替えられませんでした。

■デフォルトチャンネルを自分のダイレクトメッセージにしてみる
もしかして外部からの通知は全部slackbotになるのかと、
試しに着信Webフックのデフォルトチャンネルを自分のダイレクトメッセージ宛てしてみました。
やりたいこと通り、私にダイレクトメッセージが届きました。

補足情報(FW/ツールのバージョンなど)

使用言語:GoogleAppsScript
使用APP:発信Webフック、着信Webフック

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

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

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

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

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

guest

回答2

0

多分やりたいようにできています。
ダイレクトメッセージチャンネル(チャンネルではないですが、メッセージそのものと区別するため、こう呼びます)の仕様というか、意味を誤解していませんか?

あなた自身でログインしたときダイレクトメッセージ欄にあるスラックボットは、スラックボット⇔あなたのやりとりです。
仮にボットユーザでログインできたとしたら、ボットのあなたの名前のところに投稿内容が見えるはずです。

普通のユーザ間で考えると、鈴木さんのダイレクトメッセージ欄にある田中さんのところは、田中さんの画面では鈴木さんと書いてある欄に書き込まれた内容が表示されます。

あなたが目にするあなた自身のダイレクトメッセージチャンネル、あるいは鈴木さんが目にするダイレクトメッセージチャンネルは、自分から自分に送った、他の人には一切見えない欄です。

それでも自分の名前のところに送りたければ、宛先だけではなく、送信者を偽装して、あるユーザからそのユーザに送ったようなデータを作る必要があります(できるかどうかはわかりません)

投稿2018/09/04 03:21

papinianus

総合スコア12705

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

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

SystemAjisai

2018/09/04 04:16

ご回答ありがとうございます。 人間同士のやりとりだと確かにそうですね。。。 本文「試してみたこと」の、 ・自作のSlackAPP経由で通知してみる ・デフォルトチャンネルを自分のダイレクトメッセージにしてみる で記載の通り、上記2つの方法ではslackbotではなく自分の名前の所に通知が上がった(自分が送ったようになった)ので、そっちが正しいのかと思ってました。 私もそれの方が通知がまとまって見やすいと感じたもので…。 初期のチャンネルを自分のダイレクトメッセージにすれば自分のところに上がるけど、チャンネル上書きで送るとslackbotになるという挙動がモヤモヤしますが、あきらめることにします。。。 ありがとうございました。
guest

0

ベストアンサー

ダイレクトメッセージで送りたい場合について、

私も、channelに指定してやりたかったんですが結局できるのかできないのか分かりませんでした。

改めてドキュメントの方を見ると、
https://api.slack.com/incoming-webhooks
この項目3の最後の方に↓こうあり、シングルユーザー用のURLが作れるようです。

That URL is your shiny new Incoming Webhook, one that's specific to a single user, and a single channel. We've kind of run out of cookies, but nice work anyway! Let's see how you can actually use that webhook to post a message.

そのユーザー用のWebhook URLに送信すればダイレクトメッセージが送れました。
その際channelが設定されていた場合はchannelの方に届くようです。
結局WebAPIで行う場合にはユーザーごとのWebhook URLが必要なのかなと思いました。

投稿2018/09/04 03:52

編集2018/09/04 03:57
rocket

総合スコア41

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

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

SystemAjisai

2018/09/04 04:51

回答ありがとうございます。 やっぱり個別のURLになるのですね…。 自分のDMのとこに全部まとめたかったんですが、残念です。 着信 Web フックの設定画面のチャンネルを自分のダイレクトメッセージに設定すればできるのだから、チャンネル上書きでも何かやればできるハズ…!という思いが拭えないですが、ひとまずのところは諦めることにします。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問