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

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

詳細はこちら
Google Apps Script

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

JSON

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

Twitter

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

JavaScript

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

API

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

Q&A

解決済

1回答

1291閲覧

GASを使ってTwitterAPIから情報を取得しようとしているがうまくいかない。

spa

総合スコア52

Google Apps Script

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

JSON

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

Twitter

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

JavaScript

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

API

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

0グッド

0クリップ

投稿2021/02/14 12:14

前提・実現したいこと

GASを使ってTwitterAPIから情報を取得しようとしているのですがうまくいきません。
JSONから試しに["screen_name"]を取ってくると途中までは順調に取得できるのですが、20個取得したあたりから
TypeError: Cannot read property 'screen_name' of undefined
のエラーが出て止まってしまいます。
おそらくJSONの構文?が途中で変わるからだと思いますが詳しくはわからなかったです。

そこでcontinue文を使って、undefinedのエラーが起こった箇所を飛ばしてデータの取得を続けようとしたのですがいくら試してもわからなかったので、アドバイスいただけたらありがたいです。

それと、何度試しても常に同じ["screen_name"]を取得してしまい、新しく上がってくる最新の情報を取得できていないようなのでその点も改善方法を教えていただけたらありがたいです。
よろしくお願いいたします。

twitterのAPIリファレンス=https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/api-reference/get-search-tweets

該当のソースコード

javascript

1// タイムライン取得用のAPIを起動する関数 2function twitterSearch() { 3 var twitterService = getService(); 4 5 if (twitterService.hasAccess()) { 6 7 //検索キーワード 8 var keyword = "ブログ"; 9 10 //取得するツイート数 デフォルト15-100まで 11 var searchCount = 90; 12 13 14 var twMethod = { method:"GET" }; 15 var json = twitterService.fetch("https://api.twitter.com/1.1/users/search.json?q=" 16 + keyword + "&count=" 17 + searchCount , twMethod); 18 19 // jsonパース 20 var array = JSON.parse(json); 21 22 23 // シート取得 24 var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId()); 25 var sheet = ss.getSheetByName("twitter-follow"); 26 27 28//Twitterキーワードを繰り返し取得 29 for (var i = 0; i < searchCount; i++){ 30 var twiText = array[i]["screen_name"]; 31 32 if(array[i]["screen_name"] === undefined) 33 { 34 continue; 35} 36} 37 38//取得したものを列Aに書き込み 39 sheet.getRange(sheet.getLastRow()+1,1).setValue([twiText]); 40//重複を削除 41sheet.getRange(1, 1, sheet.getLastRow(), 1).removeDuplicates(); 42 } 43 44 // 取得した項目をログに表示 45 Logger.log(array); 46 Logger.log(twiText); 47 } 48} 49 50

試したこと

undefined, null, "",などを入れて試したり、.toString()で文字列に変えてみてもうまくいきませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

"https://api.twitter.com/1.1/users/search.json"というエンドポイントを使っていることから、
ユーザー名に「ブログ」が含まれているユーザーを抽出しようとしている、ということだと理解しました。

JSONから試しに["screen_name"]を取ってくると途中までは順調に取得できるのですが、20個取得したあたりから

TypeError: Cannot read property 'screen_name' of undefined
のエラーが出て止まってしまいます。

おそらくJSONの構文?が途中で変わるから

違います。

20個取得したあたりでエラーが出て止まるのは、20個しか取得できていないにもかかわらず、それ以上のインデックスにアクセスし、結果、undefinedに対してscreen_nameプロパティを取得しようとしたからです。
(arrayの要素はarray[19]が最大なのに、array[20]にアクセスした時点でundefinedが返り、そのundefinedに対してscreen_nameプロパティを取得しようとしたため)

公式のAPIドキュメントに明確に書かれているとおり、ユーザー名検索で取得できるデータの個数は1回のリクエストあたり最大20個です。

なぜ「searchCount = 90」 にされているのか分かりかねますが、APIの仕様として1回のリクエストあたり最大20個しか取得できません。
(ツイート検索と混同されたのでしょうか?またはユーザーではなく、ツイートの検索コードを記載している他サイトのソースを見てドキュメントを確認せずそのままコピペされたのでしょうか?)

20個以上取得したい場合は、ドキュメントにある通り、pageパラメータを都度増やして取得してください。
(なお、この場合もトータルで1000個までしか取得できません)

それと、何度試しても常に同じ["screen_name"]を取得してしまい、新しく上がってくる最新の情報を取得できていない

これも仕様です。上記user searchの公式ドキュメントのページには書かれていませんが、ツイート内容の検索APIの公式ドキュメントによると、
Stanard(無料版)のTwitter search API v1.1においては最新または話題のツイート(recent or popular Tweets)のインデックスに対する検索結果を返すとしています。
つまり、検索結果は、インデックスされたものに対する結果のため、一定期間内容が変わらないということです。
ユーザー名検索についても同じことがいえるのでしょう。

投稿2021/02/14 14:04

編集2021/02/14 14:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

spa

2021/02/15 00:02

ありがとうございました。ユーザーの抽出数に関しては完全にツイート取得数と混同していました。教えていただかなかったらずっと同じところで悩むところでした。大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問