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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Slack

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

API

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

Q&A

解決済

1回答

483閲覧

twitterのAPIで取得したjsonで、任意の文字を含むものをslackへ通知

y-oka

総合スコア9

Google Apps Script

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Slack

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

API

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

0グッド

0クリップ

投稿2018/07/22 13:27

前提・実現したいこと

今年になってプログラミングを始めた初心者です。
よろしくお願いします。

実現したいことは、以下の通りです。

1)google apps scriptから、
2)twitterの検索apiを利用し
3)検索結果をjsonで取得し
4)取得したjsonの結果、特定の文字が含まれている場合のみ
5)slackに通知する
その際、可能ならtweetを引用する

google apps scriptに1日1回のトグルを設定し、
昨日から今日までの間に、
特定のアカウントから、
特定の文字を含むツイートがあった場合を検索して、
通知させたいです。

使用したライブラリは、以下の2つです。
moment.js :MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48 ver.9
slackApp  :M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO ver.22

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

以下コード内、function updateOrNot()を実行しています。
エラーメッセージは表示されません。
Logger.logを表示すると、twitterでの検索はできていますが、
改行コード"\n"が複数含まれています。
slackには通知されません。

該当のソースコード

google

1 var API_KEY = 'API_KEY'; 2 var API_SECRET = 'API_SECRET'; 3 4// 変数dateを宣言し、現在時刻を代入 5 var nowDate = Moment.moment(); 6 7// 検索文字列指定 8 var searchWord = "検索文字"; 9 var searchAccount = "ツイッターアカウント"; 10 var searchSince = nowDate.clone().subtract(1,"days").format("YYYY-MM-DD"); 11 var searchUntil = nowDate.clone().format("YYYY-MM-DD"); 12 var searchFullText = searchWord + " from:" + searchAccount + " since:" + searchSince + " until:" + searchUntil; 13 14 15// アクセストークンの取得 16function getAccessToken() { 17 var url = 'https://api.twitter.com/oauth2/token'; 18 var credential = Utilities.base64EncodeWebSafe(API_KEY + ':' + API_SECRET); 19 var options = { 20 headers : { 21 Authorization: 'Basic ' + credential, 22 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' 23 }, 24 method: 'post', 25 payload: 'grant_type=client_credentials' 26 }; 27 var response = UrlFetchApp.fetch(url, options); 28 var json = JSON.parse(response); 29 var accessToken = json.access_token; 30 31 return accessToken 32} 33 34 35// リクエスト 36function request2(text) { 37 var accessToken = getAccessToken(); 38 if(accessToken) { 39 var baseurl = "https://api.twitter.com/1.1/search/tweets.json"; 40 var q = encodeURIComponent(text); 41 var url = baseurl + "?q=" + q + "&lang=ja&result_type=recent"; 42 var options = { 43 headers : { 44 Authorization: 'Bearer ' + accessToken 45 }, 46 method: 'get', 47 escaping: false, 48 muteHttpExceptions: true 49 }; 50 var response = UrlFetchApp.fetch(url, options); 51 var result = JSON.parse(response.getContentText()); 52 Logger.log(JSON.stringify(result, null, 2)); 53 return result; 54 55 56// slackのチャンネルに投稿する 57 var slackAccessToken = 'xoxp-slackAccessToken'; 58 var slackApp = SlackApp.create(slackAccessToken); 59 var channelId = "#twitter"; // 対象チャンネル 60 61 62// slackに送る文字列 63 var bot_icon ="https://www.sample.com/sample.png"; //Botのアイコン 64 var bot_name = "botbot"; // Botの名前 65 var strBody = "更新されました"; 66 var message = strBody; // 投稿するメッセージ 67 68 slackApp.postMessage(channelId, message, { 69 icon_url: bot_icon, 70 username: bot_name 71 }); 72 73 74// イベントがある時のみpostする 75//  更新されたかどうか、条件分岐 76 if(result.indexOf(searchWord) != -1) { 77 slackApp.postMessage(channelId, message, { 78 icon_url: bot_icon, 79 username: bot_name 80 }); 81 }; 82 }; 83 } 84 85 86// 検索文字 87function updateOrNot() { 88 request2(searchFullText); 89 } 90

試したこと

jsonに改行コードが含まれていると、正常にjsonの取得が
うまく働かないという記事も見たため、
// リクエスト
内のjsonパース部分を以下の2行に置き換えてみました。
var newResponse = response.replace(/\n/g, "");
var result = JSON.parse(newResponse.getContentText());

しかし、以下のエラーメッセージが出てしまいました。

TypeError: Cannot find function replace in object
{"statuses":[{"created_at":"Sat Jul 21 08:59:01 +0000

初歩的なミスだとは思いますが、
ご指摘よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1var newResponse = response.replace(/\n/g, "");

「response」は文字列型ではないため、replaceメッソドが存在せずエラーとなっています。

1.文字列へ変換
2.改行をreplace
3.JSONへパース
という順にすればうまくいくかと思います。

javascript

1var responseStr = response.getContentText() 2var newResponseStr = responseStr.replace(/\n/g, ""); 3var result = JSON.parse(newResponseStr); 4

以下追記

自分の環境でも/\n/gは赤色(オレンジ?)になっていますので正常ではないかと思います。
少し試してみたのですが、もしかしたら改行コードが"\n"ではなく"\r\n"なのではないでしょうか?

function myFunction() { var str1 = "ほげ\nもげ" var newStr1 = str1.replace(/\n/g, ""); Logger.log(str1) Logger.log(newStr1) //[18-07-25 13:42:31:528 JST] ほげ //もげ //[18-07-25 13:42:31:528 JST] ほげもげ var str2 = "ほげ\r\nもげ" var newStr2 = str2.replace(/\n/g, ""); Logger.log(str2) Logger.log(newStr2) //[18-07-25 13:42:31:529 JST] ほげ //もげ //[18-07-25 13:42:31:529 JST] ほげ //もげ }

投稿2018/07/23 04:48

編集2018/07/25 04:49
recter

総合スコア37

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

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

y-oka

2018/07/25 04:09

回答していただき、ありがとうございます。 おかげで、エラーは出なくなりました。 ですが、Logger.logの結果は今まで同様 改行コードが含まれたままになってしまいます。 /\n/g の部分が、google apps script(GAS)内では 赤字になってしまうのですが、なぜなのかおわかりになりますか?
y-oka

2018/07/25 05:42

recter様 再度回答していただき、ありがとうございます。 "\r\n"に変更してみましたが、"\n"(実際は半角バックスラッシュとn)が複数残ってしまう現象に、変化がありません。 今後はパーツごとに分割して、ひとつずつエラーがないことを確認してみます。 自分にとっては、長文のコードになってしまったように感じるので、頭の中を整理整頓します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問