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

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

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

Google サイトは、Google社が提供する無料のホームページ作成ツールです。プログラミングやデザインなどの知識がなくても、ブラウザから容易にWebページを作成することが可能。新たなページの追加も簡単でページ数には制限がありません。

Google Apps Script

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

Twitter

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

Q&A

1回答

944閲覧

undefined からプロパティ「id_str」を読み取れません。

退会済みユーザー

退会済みユーザー

総合スコア0

Google サイト

Google サイトは、Google社が提供する無料のホームページ作成ツールです。プログラミングやデザインなどの知識がなくても、ブラウザから容易にWebページを作成することが可能。新たなページの追加も簡単でページ数には制限がありません。

Google Apps Script

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

Twitter

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

0グッド

1クリップ

投稿2021/11/22 07:46

編集2021/11/22 07:50

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

TypeError: undefined からプロパティ「id_str」を読み取れません。 getTweetStatus @ コード.gs:123

該当のソースコード

function main () { var status = getTweetStatus(tweet); } function getTweetStatus (tweet) { var service = twitter.getService(); var response = service.fetch('https://api.twitter.com/1.1/statuses/lookup.json?id=' + tweet.id_str); var result = JSON.parse(response) return result[0]; }

試したこと

ここに問題に対して試したことを記載してください。

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

GASにあまり詳しくないため、下記のサイトをにあるコードをコピペしています。
https://belltree.life/twitterapi-likes-retweet/

それまでは問題なく動作していましたが、突然、このようなエラーが表示されるようになりました。
Chrome V8 ランタイムは無効です。

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

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

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

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

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

guest

回答1

0

変数tweetが定義されていないことによるエラーです。
関数getTweetStatusが引数なしで呼び出されたか、またはgetTweetStatusの引数に定義されていない変数が与えられていると思われます。
関数getTweetStatusがどこから呼び出され、そのときの引数はどうなっているのかを調べてください。

投稿2021/11/22 08:32

itagagaki

総合スコア8402

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

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

退会済みユーザー

退会済みユーザー

2021/11/22 13:34

回答ありがとうございます。 確認しましたところ、 getTweetStatusは、tweetを引数として呼び出されていました。 tweetは、 for (var j = 0, jl = tweetList.length; j < jl; j++ ) { var tweet = tweetList[j]; (中略) } となっているので、未定義ではないと思われます。 tweetListは、 var tweetList = findTweets(searchWord, lastTweetId); と定義されていると思われます。 この場合、 findTweets関数に何か問題があると考えるべきでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/22 13:54

念のため、コピペしたコードを記載しておきます。 よろしくお願いいたします。 // 認証用インスタンス var twitter = TwitterWebService.getInstance( '*****************', // 作成したアプリケーションのConsumer Key '************************************************' // 作成したアプリケーションのConsumer Secret ); // 認証 function authorize() { twitter.authorize(); } // 認証解除 function reset() { twitter.reset(); } // 認証後のコールバック function authCallback(request) { return twitter.authCallback(request); } // セルを取得 var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名 /** いいね or RT 機能 ① 検索ワードをスプレッドシートから取得する ② 検索ワードをTwitterで検索する(たくさん取れてしまうので「直近10分間」の検索を10分毎に行う) ③ ツイートに いいね or RT をする ④ 他に検索ワードがあれば②に戻る */ function main () { // ① 検索ワードをスプレッドシートから取得する var searchWords = pickUpSearchWords(); // searchWordsの中身は // [ [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] ,....,] // という形式になっているので1つずつ見ていく for (var i = 0, il = searchWords.length; i < il; i++ ) { var searchWord = searchWords[i][0]; var type = searchWords[i][1]; var lastTweetId = searchWords[i][2]; // ② Twitterで検索する var tweetList = findTweets(searchWord, lastTweetId); // ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする for (var j = 0, jl = tweetList.length; j < jl; j++ ) { var tweet = tweetList[j]; // 最新のツイートのIDを取る if (tweet.id_str > lastTweetId) { lastTweetId = tweet.id_str; } var status = getTweetStatus(tweet); if (type == 'いいね') { if (!status.favorited) { putFavorite (tweet); } } else if (type == 'RT') { if (!status.retweeted) { putRetweet (tweet); } } } // 重複処理をしないように最新のツイートIDを保存する var titleRow = 1; // 『検索ワード』とか書いている部分の行数 var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる updateCell.setValue(lastTweetId); } } // 検索ワードをスプレッドシートから取得する function pickUpSearchWords () { var titleRow = 1; // 『検索ワード』とか書いている部分の行数 var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から var startCol = 1; var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している) var endCol = 3; // 『最終TweetId』の列までなので3列目まで // 一括で取得する var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues(); // ちなみにcellsの中身は // [ [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] ,....,] // という形式になっている return cells; } // ツイートを検索する // 【参考】 https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets function findTweets (searchWord, lastTweetId) { var service = twitter.getService(); var query = { q: searchWord, // 検索ワード lang: 'ja', // 日本語検索 locale: 'ja', // 日本限定で検索 result_type: 'recent', // 直近のツイートを検索 since_id: lastTweetId // これ以前のツイートは見ない } // 検索の内容を queryStr にまとめていく var queryStr = ''; for (var key in query) { // URLに日本語や記号を付けると上手く検索できないことがあるので#も変換する encodeURIComponent をする queryStr += key + '=' + encodeURIComponent(query[key]) + '&' } // &が余計に付いているので削除しておく var queryStr = queryStr.slice(0, -1); var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + queryStr); var result = JSON.parse(response) return result.statuses } // いいね/RTの状態を確認 // 【参考】 https://developer.twitter.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/get-statuses-lookup function getTweetStatus (tweet) { var service = twitter.getService(); var response = service.fetch('https://api.twitter.com/1.1/statuses/lookup.json?id=' + tweet.id_str); var result = JSON.parse(response) return result[0]; } // いいね を付ける // 【参考】 https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-favorites-create function putFavorite (tweet) { var service = twitter.getService(); var response = service.fetch('https://api.twitter.com/1.1/favorites/create.json', { method: 'post', payload: { id: tweet.id_str } }); } // RT を付ける // 【参考】 https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-retweet-id function putRetweet (tweet) { var service = twitter.getService(); var response = service.fetch('https://api.twitter.com/1.1/statuses/retweet/' + tweet.id_str +'.json', { method: 'post' }); }
itagagaki

2021/11/22 15:00

何が起こっているかを把握する簡単な方法は var tweet = tweetList[j]; の前か後に console.log('tweetList[' + j + '] : ' + tweetList[j]); を入れて実行させてみてログ出力を解析することです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問