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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2191閲覧

GAS環境でSlack APIで送信されたボタンのアクションを検知する方法がわからず困っています

kumakuma112

総合スコア21

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2021/10/21 10:36

編集2021/10/21 10:37

Slackでリアクションスタンプを検知して、内容を取得後、postEphemeralで内容に問題ないか確認させるメッセージを送信。 ボタンをクリックしたらデータベースかスプレットシートに登録させるツールを作ろうと思ってます。

①Slackでリアクションスタンプの検知は成功してます
Event SubscriptionsにGASのURLを登録してます

②Slackへのメッセージ送信も成功してます
UrlFetchApp.fetch(url, postData);で送信できてます

③今つまづいているは、ボタンをクリックした際の取得の部分です
401エラーがでます。
送信先用にInteractivityにもう一つGASを登録しています。

何が原因なんでしょうか?

イメージ説明

Event Subscriptionsに登録しているGAS

JS

1//プロパティ 2const scriptProperties = PropertiesService.getScriptProperties(); 3scriptProperties.setProperties({ 4 'SLACK_ACCESS_TOKEN': 'xoxb-xxxxxxxxxxxxxxx', 5 'SLACK_VERIFICATION_TOKEN': '' 6}); 7 8// メイン 9function doPost(e){ 10 var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN'); 11 var url = "https://slack.com/api/chat.postEphemeral"; 12 var reaction_torigger_emoji = 'gorilla'; 13 var json = JSON.parse(e.postData.getDataAsString()); 14 var event = json.event; 15 16 if(event){ 17 if (event.type === 'reaction_added') { 18 if (reaction_torigger_emoji == event.reaction) { 19 // トリガーになる絵文字があれば実行 20 var channelId = event.item.channel; 21 var userId = event.item_user; 22 var message = conversationsRepliesMessage(token, event.item.channel, event.item.ts); 23 var postText = message.messages[0].text; 24 //var currentDirectoryChannel = getCurrentDirectoryChannel(token, event.item.channel); 25 var postData = privatePostData(token, channelId, userId, postText); 26 27 UrlFetchApp.fetch(url, postData); 28 } 29 } 30 } 31 32 // Events APIを使用する初回確認のための記述 33 if (json.type === 'url_verification') { 34 return ContentService.createTextOutput(json.challenge); 35 } 36} 37 38//------------------------------------------------------------ 39// Slackに送信 40//------------------------------------------------------------ 41function privatePostData(token, channel, user, postText){ 42 var blocks = [ 43 { 44 "type": "input", 45 "element": { 46 "type": "plain_text_input", 47 "action_id": "actionId_title", 48 "initial_value": title 49 }, 50 "label": { 51 "type": "plain_text", 52 "text": "タイトル", 53 "emoji": true 54 } 55 }, 56 { 57 "type": "actions", 58 "elements": [ 59 { 60 "type": "button", 61 "action_id": "actionId_send", 62 "text": { 63 "type": "plain_text", 64 "text": "送信する" 65 }, 66 "style": "primary", 67 "value": "click" 68 } 69 ] 70 } 71 72 var payload = { 73 "token": token, 74 "channel": channel, 75 "text": "確認お願いします", 76 "user": user, 77 "as_users": false, 78 "attachments": "", 79 "blocks": JSON.stringify(blocks), 80 "icon_emoji": "", 81 "icon_url": "", 82 "link_names": true, 83 "username": "" 84 }; 85 var params = { 86 "method": "post", 87 "payload": payload 88 }; 89 return params 90}

送信後に受け取る用のInteractivityに登録してるGAS

JS

1//プロパティ 2const scriptProperties = PropertiesService.getScriptProperties(); 3scriptProperties.setProperties({ 4 'SLACK_ACCESS_TOKEN': 'xoxb-xxxxxxxxxxxxxxx', 5 'SLACK_VERIFICATION_TOKEN': '' 6}); 7 8// メイン 9function doPost(e){ 10 var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN'); 11 var data = e.parameter.payload; 12 var json = JSON.parse(data); 13 14 if (e.parameter.payload){} 15 16 // RequestURLの検証用 17 else{ 18 var data = JSON.parse(e.postData.getDataAsString()); 19 if(data.type === "url_verification"){ 20 return ContentService.createTextOutput(data.challenge); 21 } 22 } 23} 24

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

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

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

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

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

guest

回答2

0

あと、コードにいくつか改善した方が良い点が見られるので、私が書いたこちらの記事を参考にしていただければ幸いです: https://qiita.com/seratch/items/2158cb0abed5b8e12809

投稿2021/10/22 02:33

seratch

総合スコア215

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

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

0

ベストアンサー

おそらく GAS の Web アプリ側が Google アカウントでの認証必須になっているからだと思います。GAS の方の設定を見直してみてください。Google Workspace の管理者機能にはあまり詳しくないのですが、企業の Google アカウントの場合は管理者によって制限がかかっている場合もあるかもしれません。

投稿2021/10/22 01:44

seratch

総合スコア215

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

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

kumakuma112

2021/10/22 02:25

Google Workspaceは企業だと制限掛かるため個人アカウントで作成してます。認証は通してるはずですなのですが、わからず、、、
seratch

2021/10/22 02:28

その Web アプリへのリクエストに認証を求めない設定というのがあったはずです。Slack のサーバーからリクエストが来るわけなので、認証が不要な設定にする必要があります。
seratch

2021/10/22 02:30

今確認してみましたが、Web app の deployment の設定に Who has access というのがあり、only myself / Anyone with Google account / Anyone の三種類があると思いますが Anyone にしないとダメですね。日本語で使っている場合は表記が微妙に異なるかもしれません。
kumakuma112

2021/10/22 04:08

確認してみます。ありがとうございます
kumakuma112

2021/10/25 08:11

コードは動いてたようで、ご指摘の通り、受け取る側の認証範囲が間違ってました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問