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

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

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

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

Slack

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

Q&A

解決済

1回答

11180閲覧

UrlFetchApp.Fetchで400エラーが出てしまう

jimunomado

総合スコア19

Google Apps Script

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

Slack

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

0グッド

0クリップ

投稿2019/02/13 07:23

編集2019/02/14 02:51

前提・実現したいこと

SlackBotをGoogle Apps Scriptで作っています。
以下のページを参考に、yahooの運行情報から指定した路線の運行情報を、指定したチャンネルに投稿するbotを作ろうとしています。

Google Apps Script で京急線と京浜東北線の遅延情報を【無料】でSlack 通知の巻

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

function postMessage実行時に以下のエラーが発生します。(なおfunction trainlateについてはエラーが発生していないようです)

https://hooks.slack.com/services/hogehoge (SlackAPIで取得したWebhookURL)のリクエストに失敗しました(エラー: 400)。サーバー応答の一部: missing_text_or_fallback_or_attachments(応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 65、ファイル「コード」)

該当のソースコード

Google

1var response = UrlFetchApp.fetch('https://hooks.slack.com/services/hogehoge',options);

ソースコード全体

Google

1function trainlate() { 2 3 var currentDate = new Date(); 4 var weekday = currentDate.getDay(); 5 var date = Utilities.formatDate( currentDate, 'Asia/Tokyo', 'M月d日 HH時mm分'); 6 7 if (weekday == 0 || weekday == 6) { 8 return; 9 } 10 var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); 11 if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) { 12 return; 13 } 14 15 //soubu line info 16 var yahoodata = UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/40/0/").getContentText(); 17 if(yahoodata.indexOf('現在、事故・遅延に関する情報はありません') > -1){ 18 // match the word 19 }else{ 20 //get error info 21 var yahoodatastart = yahoodata.indexOf('og:description" content="'); 22 //4 japanese word only 23 yahoodatastart += 25; 24 var yahoodataend = yahoodata.indexOf('の情報です。'); 25 var yahoodataoutput = yahoodata.substring(yahoodatastart, yahoodataend); 26 27 postMessage("\n" + "◆総武線 " + date + yahoodataoutput + "\n",'https://hooks.slack.com/services/hogehoge'); 28 } 29 30 31 //tokrometro tozai line info 32 var yahoodata2 = UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/135/0/").getContentText(); 33 if(yahoodata2.indexOf('現在、事故・遅延に関する情報はありません') > -1){ 34 // match the word 35 }else{ 36 //get error info 37 var yahoodatastart2 = yahoodata2.indexOf('og:description" content="'); 38 //4 japanese word only 39 yahoodatastart2 += 25; 40 var yahoodataend2 = yahoodata2.indexOf('の情報です。'); 41 var yahoodataoutput2 = yahoodata2.substring(yahoodatastart2, yahoodataend2); 42 43 postMessage("\n" + "◆東京メトロ東西線 " + date + yahoodataoutput2 + "\n",'https://hooks.slack.com/services/hogehoge'); 44 45 } 46 47 48} 49 50 51function postMessage(message, hookPoint){ 52 var payload = { 53 "text": message, 54 "channelId": '#train_info', 55 "userName": 'train_info', 56 "icon_emoji": ':train:' 57 } 58 var options = { 59 "method": "POST", 60 "payload": JSON.stringify(payload), 61 "headers": { 62 "Content-type": "application/json", 63 } 64 } 65 var response = UrlFetchApp.fetch('https://hooks.slack.com/services/hogehoge',options); 66 67 if (response.getResponseCode() == 200) { 68 return response; 69 } 70 return false; 71}

試したこと

ネットの海をさまよい、これがhttp400エラーに同じ?ということはわかったのですが、何をどう間違えたのか全く分からずにいます。というのも、GASに対する知識もSlackBotに対する知識もないド素人のためです……。
ド素人がわからんことをするんではない!という批判は甘んじて受けますが・・・対処法ご教示願えますと幸いです。

追記

以下追記してログを表示したところ"undefined"と出てしまいました。

Google

1Logger.log(message);

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

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

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

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

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

papinianus

2019/02/13 07:42

postMessageでエラーが発生しているはずですが、postMessageをエラーなく実行できました。 * incoming webhookを利用していると思うんですが、'https://hooks.slack.com/services/hogehoge'ってかいてあるやつのhogehoge部分は「英大文字数字9桁」/「英大文字数字9桁」/「英数字27桁」になっていますか? * 送信する文字列起因の可能性があります。 function postMessage(message, hookPoint){ Logger.log(message); //これ var payload = { これを挿入して、表示→ログから出力された運行情報を質問に追記してください
jimunomado

2019/02/13 07:54

ご回答いただきありがとうございます。 >* incoming webhookを利用していると思うんですが、'https://hooks.slack.com/services/hogehoge'ってかいてあるやつのhogehoge部分は「英大文字数字9桁」/「英大文字数字9桁」/「英数字27桁」になっていますか? 最後ですが、「英数字24桁」になっています。コピペミスかと思い、SlackAPIからもう一度確認いたしましたが、「英数字24桁」で間違いはなさそうです。
guest

回答1

0

ベストアンサー

incomingwebhooksの構成がこちらと違うのはちゃんと確認してませんが、messageとしてundefinedを渡すと、textがないので、提示のように必須であるはずのtextがないよ、というエラーです。

今気付いたのですが、関数の実行で、postMessageを実行してますよね?
それでは動きません。
trainlateを実行してください。その際、うまいぐあいに東西線や総武線が遅延しているとは限らないので、yahooをみて、遅延している情報がある列車のurlを探しだして、テストしてみてください。

もしくは↓の「これ」を入れれば、メッセージ固定ですがテストが行えます

javascript

1function postMessage(message, hookPoint){ 2message = message || "test"; //これ

私も同じようなslackbotを作ってますが、何かあったときだけ通知がくるようにしています。
じゃないと、通知がうざすぎるので。

ですが、↓のようなことをすれば、「遅れていない」を送信することはできると思います。

javascript

1 //tokrometro tozai line info 2 var yahoodata2 = UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/135/0/").getContentText(); 3 if(yahoodata2.indexOf('現在、事故・遅延に関する情報はありません') > -1){ 4 // match the word 5 postMessage("\n" + "◆東西線は遅れていません\n",'https://hooks.slack.com/services/hogehoge'); 6 }else{

投稿2019/02/13 08:01

編集2019/02/20 05:11
papinianus

総合スコア12705

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

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

jimunomado

2019/02/14 02:39

ご回答ありがとうございます。 一点質問追記させていただきました。またいただいた回答については後程確認いたします(別件割り込み案件が入ってしまったため)。申し訳ございません、、、。
papinianus

2019/02/14 02:46

それは全く無関係です。 hookpointにurlを渡すはずが、Urlfetchではurlを固定にしており、出番がない(使用されてない)ことをstylecopが注意しているものです。 また、vsの右上のアカウント表示のところに、おそらく姓名と見られる文字列が出ていますので、加工して更新なさることをすすめます。
jimunomado

2019/02/14 02:51 編集

すみません右上の名前については本名ではなく仮名です。ご心配おかけし申し訳ございません、、、。 なるほど、そういうことなのですね。 回答いただいている件につきましては、後程確認して改めて回答申し上げます。取り急ぎ。
papinianus

2019/02/14 02:55

仮名で良かったです。 基本的にはvsの警告には従わなければならないですが、本件については無関係です。 また、エラーが消えてから、ワーニングに対応するのが順序なので、後回しでお願いします。
jimunomado

2019/02/20 04:21

お返事が遅くなり大変失礼いたしました。現在遅延が出ている線路でtrain_lateを実行したところ、ちゃんと電車が遅延しているというメッセージが適切に返されました。しかし、遅延が発生していない電車では何も返しませんでした。。。
papinianus

2019/02/20 05:06

元々のコードがそうなっていましたし、遅延が発生していないから何もなくてOKなんじゃないのですか? 「遅延していません」という通知が欲しいということですか?
jimunomado

2019/02/20 05:18

ハッ…よくコードを読んでいませんでした<(_ _)> いえいえ、遅延があったら通知してくれればよいので、これでよかったのです。 お手数をおかけして申し訳ございませんでした<(_ _)> いろいろと大変勉強になりました。
papinianus

2019/02/20 05:19

参考までに回答に追記しています。
jimunomado

2019/02/20 07:03

重ね重ねありがとうございます(TT)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問