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

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

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

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

JavaScript

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

Slack

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

API

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

Q&A

解決済

2回答

822閲覧

Dialogに入力した文字列をSlackのメッセージに書き換えたい

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

JavaScript

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

Slack

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

API

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

0グッド

0クリップ

投稿2018/08/27 10:28

編集2018/08/29 07:51

###できていること・やりたいこと
Slack に/hogehogeと入力して送信すると、
dialog
という感じでメッセージが送られ、
Editを押すと
openDialog
とダイアログが表示されます。
ここに何らかの文字列を入力してSubmitすると、また最初の図の画面に戻ります。
入力した文字列の取得もできています。

そこまではいいのですが、入力した文字列を「入力して」のところに書き換えたいのです。
###分からないこと
下のコードで実行してみました。
エラーが表示されるということはないですが、
書き換えることはできませんでした。

実行した時のpayloadを見ると、タイムスタンプが含まれていませんでした。
おそらく、ダイアログが実行されてその結果がdoPostに返されるとき、返されるtsはaction_tsのため、
chat.updateに必要なtsをvar message_ts = json['message_ts'];として得ようとするとダメなんでしょうか。

または、Slack への送信はwebhookを使っているため、chat.updateを書き換えのときだけ使用しているのがいけないのでしょうか。
chat.updateとresponse_urlのどちらかを使えとSlackの公式に書きてありましたが、response_urlの場合、制限があるようなので今回のプログラムには使いたくないです。

Javascript

1function doPost(e){ 2 var parameter=e.parameter; 3 var data = parameter.payload; 4 var json = JSON.parse(decodeURIComponent(data)); 5 var trigger_id = parameter.trigger_id; 6 var trigger_id = json.trigger_id; 7 var callback_id = parameter.callback_id; 8 var callback_id = json.callback_id; 9 var token = parameter.token; 10 var token = json.token; 11 var submission = parameter.submission; 12 var submission = json.submission; 13 var message_ts = parameter.message_ts; 14 var message_ts = json.message_ts; 15 16 // button 17 if (callback_id == 'button'){ 18 var respond_dialog = Slack_Dialog(trigger_id,callback_id,message_ts); 19 } 20 //dialog 21 else if(callback_id == 'dialog'){ 22 var subject = submission.dialg_subject; 23 var description = submission.dialg_description; 24 var words = submission.dialg_words; 25 26 //var response_url = "https://hooks.slack.com/xxxxxxx-xxx"; 27 var url= 'https://hoge/slack.com/api/chat.update'; 28 // get object elements 29 var user = json['user'].name; 30 var message_ts = json['message_ts'];//ここがボタンを押したときのタイムスタンプでないとダメ? 31 var channel_id = json['channel'].id; 32 var payload = { 33 "token" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb", 34 'channel' : channel_id, 35 'ts' : message_ts, 36 'text' : subject+"\n"+description+"\n"+words,//書き換え後のテキスト 37 }; 38 var options = {'method':'post','payload':payload}; 39 40 var result = UrlFetchApp.fetch(url, options); 41 } 42//以下略 43}

###追記
chat.updateのpayloadの中身と周辺です。
buttonが押されたときのcallback_idで分岐しています。

javascript

1 if (callback_id == 'hogehogehoge'){ 2 var response_url = 'https://slack.com/api/chat.update'; 3 var user = json['user'].name; 4 var message_ts = json['message_ts']; 5 var channel_id = json['channel'].id; 6 var payload = { 7 'token':'xoxp-xxxxxxx-xxxxx...xxxc', 8 'channel' : channel_id, 9 'ts' : message_ts, 10 'text' : '入力してください\n'+subject+'\n'+description+'\n'+words, 11 }; 12 var options = {'method':'post','payload':payload}; 13 var result = UrlFetchApp.fetch(response_url, options); 14 return ContentService.createTextOutput(); 15 }

###追記2

json

1//resultの結果 2{"ok":false,"error":"message_not_found"} 3 4//payloadの中身 5{"type":"dialog_submission","token":"LXXXXXXXXXXXXX","action_ts":"1535445637.513198", 6"team":{"id":"XXXXX","domain":"hogehoge"},"user":{"id":"XXXXXXX","name":"XXXX"}, 7"channel":{"id":"XXXXXX","name":"XXXXXX"},"submission":{"dialg_subject":"入力したものはちゃんと取得"}, 8"callback_id":"dialog","response_url":"https://hooks.slack.com/app/.....","state":""} 9

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

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

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

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

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

macaron_xxx

2018/08/28 00:23

payloadのtextに不要なダブルクオートが入っているのは転記ミスですよね?
退会済みユーザー

退会済みユーザー

2018/08/28 00:27

はい、ありがとうございます。直しました
guest

回答2

0

ベストアンサー

Dialogのstateパラメーターにmessage_tsを渡すことにした。
本体の使い方としてあっているかは不明だが、Dialog実行後のレスポンスにはstateが使われず残っていた(追記2参照)。

JSON

1//略 2var dialog = { 3 "token": "xxxxxx-xxxxxxxxxx",//OAuth token 4 "trigger_id": trigger_id, 5 "dialog": JSON.stringify({ 6 "callback_id": "dialog", 7 "state":message_ts,//ここが大事 8 "title": "入力して", 9 "submit_label": "Submit", 10 "elements": [ 11 { 12 "type": "text", 13 "label": "入力してね", 14 "name": "subject" 15 }]})}; 16//略

以下で取得可能

javascript

1var message_ts = json['state'];

以上で、Dialogに入力してメッセージの書き換えが完了した。

投稿2018/08/30 04:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

var result = UrlFetchApp.fetch(url, options);

の結果は、

{ "ok": false, "error": "message_not_found" }

このような形で返ってきていませんか?

tsは編集するメッセージが投稿されたタイムスタンプになりますので、action_tsだとダメかもしれませんね。
投稿のタイムスタンプが取得できる術を考えないといけないですね。

投稿2018/08/28 00:38

macaron_xxx

総合スコア3191

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

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

退会済みユーザー

退会済みユーザー

2018/08/28 01:26

投稿のタイムスタンプを取得するには、スプレッドシートに書き出してそれを読み込むか、キャッシュさせるかのどちらかでしょうか
macaron_xxx

2018/08/28 01:30

紐づくのであれば、なんでもいいと思いますが、 複数回 /hogehoge をした際にどのメッセージかを紐付けないといけないです。 (必ず最新のもの、とかであれば、スプレッドシートに/hogehogeされるたびにタイムスタンプを書き込むのが楽かもしれませんね。
退会済みユーザー

退会済みユーザー

2018/08/28 02:45 編集

payloadの中身を'token'としてそのまま取得すると var payload = { "token" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb", 略 そしてそのresultの結果を見たところ、 {"ok":false,"error":"invalid_auth"} でした。tokenがいけないかんじでしょうか。 そして、こんどはtokenをOAuthのtokenに指定したところ {"ok":false,"error":"missing_scope","needed":"chat:write:user","provided":"identify,commands,incoming-webhook"} ということでした。
macaron_xxx

2018/08/28 02:44

そうですね。 そのエラーだとtokenがおかしいですね。
macaron_xxx

2018/08/28 02:46

tokenはpostしている時と同じtokenを固定で指定すればいいのでは?と思いますが。
退会済みユーザー

退会済みユーザー

2018/08/28 03:46

ありがとうございます。tokenはうまくいったようですが、スコープにchat:write:userを追加したところ、 {"ok":false,"error":"cant_update_message"}か {"ok":false,"error":"message_not_found"} というエラーが表示されました。あとはタイムスタンプかなという感じです。
退会済みユーザー

退会済みユーザー

2018/08/28 03:49

action_tsではなく、message_tsが取得できているのですが、謎ですね。
macaron_xxx

2018/08/28 03:54

parameter.payloadの中身を追記いただけますか?
macaron_xxx

2018/08/28 05:46

追記いただきたいのは、ダイアログからSubmitしたときのe.parameter.payloadの中身です。
退会済みユーザー

退会済みユーザー

2018/08/28 08:47

すいません。追記しました。 あと、気になる記事も見つけました。 https://github.com/pepabo/collec/issues/11 ただ、bearer tokenの使い方はよくわかりません。
macaron_xxx

2018/08/29 00:46

var message_ts = json['ts']; ってなってますが、jsonにts含まれてませんよね??
macaron_xxx

2018/08/29 00:48

>message_tsが取得できているのですが とありますが、 payloadの"action_ts":"1535445637.513198"がmessage_tsと一致しているということですか?
退会済みユーザー

退会済みユーザー

2018/08/29 00:48

転記し間違えていました。ご指摘ありがとうございます。
macaron_xxx

2018/08/29 00:50

message_tsもjsonに含まれていませんよね。
macaron_xxx

2018/08/29 00:51

やはり >投稿のタイムスタンプが取得できる術を考えないといけないですね。 ここに落ち着きそう。
退会済みユーザー

退会済みユーザー

2018/08/29 01:41 編集

はい。Dialogの場合、含まれていません。 なので、ボタンを押したときにmessage_tsを取得するしかないと思いました。 Dialogに入力したものをchat.updateでメッセージが更新できるか確認するのは原因が探れないため、 そもそもボタンを押すとupdateできるか試してみましたが、できませんでした。 お手数かけします汗
macaron_xxx

2018/08/29 01:40 編集

message_tsは固定値で与えて試してみたということですか? 何をして、どうだったか。を明確に伝えてください。 あやふやな情報だと、何をしたかが全くわかりません。 >そもそもボタンを押すとupdateできるか試してみましたが、できませんでした。 どのようにボタンを押すとupdateできるか試してみましたか。 「何をしたのか」を具体的に示してください。
退会済みユーザー

退会済みユーザー

2018/08/29 01:46 編集

messge_tsを固定して試すということはしていません。 message_tsを受け渡すことは置いといて、 まずbotメッセージについているボタンを押すとメッセージが更新できるか試しているところです。 なので、このページの一番最初の図でEditボタンを押すと「入力して」の文字が更新されるかどうかを見ています。
macaron_xxx

2018/08/29 02:11 編集

>メッセージが更新できるか試しているところ メッセージを更新(chat.update)するためにはそのメッセージをpostしたタイムスタンプが必ず必要です。 message_tsの受け渡しを置いといて、更新できるかを試すためには、更新したいPOSTのmessage_tsをプラグラムに固定するなどしておくしか方法はないかと思います。 ※ボタンを押したときのpayloadの中身がわかりませんが、おそらくその場合にもmessage_tsは取得できないのではと思っております。 -- 追記 -- ボタンではmessage_tsが返ってくるんですね。失礼しました。 それでも更新できないとなると…うぅん。。
macaron_xxx

2018/08/29 02:26 編集

もしかして、投稿ユーザと更新ユーザが別ということはないですよね? (トークンが別)
退会済みユーザー

退会済みユーザー

2018/08/29 02:42

mesage_tsを固定して試したところ、message_not_foundと返されました。 そうですね、トークンがたくさんあってこちらも混乱しているのですが、その可能性は高いです。 ちゃんと確認してみます。ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/08/29 05:06

投稿方法をwebhookからchat.postMessageに変え、投稿と更新のトークンを統一したところ、ボタンをクリックしたときにメッセージを更新することができました。 ありがとうございます。 これからDialogにmessage_tsの引継ぎと更新のほうを試してみたいと思ます。
macaron_xxx

2018/08/29 06:46

やはりトークンが別でしたか!進みそうでよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問