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

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

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

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

Q&A

解決済

1回答

1732閲覧

Google apps script TwitterのTrendを取得してシートに書き出す

pon244

総合スコア59

Google Apps Script

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

0グッド

0クリップ

投稿2021/06/18 14:24

編集2021/06/18 15:44

【したいこと】
GASとTwitterAPIを使用して、Twitterのトレンドを抽出して、シートに書き出す。

【つまづいてるとこ】
api認証までは完了したが、setValue(result);の部分がシートに代入されない。
お力を貸していただけますと幸いです。

function getOAuthURL() { Logger.log(getService().authorize()); } // サービス取得 function getService() { return OAuth1.createService('Twitter') .setAccessTokenUrl('https://api.twitter.com/oauth/access_token') .setRequestTokenUrl('https://api.twitter.com/oauth/request_token') .setAuthorizationUrl('https://api.twitter.com/oauth/authorize') // 設定した認証情報をセット .setConsumerKey(PropertiesService.getScriptProperties().getProperty("CONSUMER_API_KEY")) .setConsumerSecret(PropertiesService.getScriptProperties().getProperty("CONSUMER_API_SECRET")) .setCallbackFunction('authCallback') // 認証情報をロパティストアにセット(これにより認証解除するまで再認証が不要になる) .setPropertyStore(PropertiesService.getUserProperties()); } // 認証成功時に呼び出される処理を定義 function authCallback(request) { var service = getService(); var authorized = service.handleCallback(request); if (authorized) { return HtmlService.createHtmlOutput('success!!'); } else { return HtmlService.createHtmlOutput('failed'); } } // function getTrends() { // let service = getService(); // if (service.hasAccess()) { // // id=1118370 を指定することで、東京のトレンドを取得 // let url = 'https://api.twitter.com/1.1/trends/place.json?id=1118370'; // let response = service.fetch(url, { // method: 'get' // }); // let result = JSON.parse(response.getContentText()); // let ss = SpreadsheetApp.getActiveSpreadsheet(); // let sheet = ss.getSheetByName("Trend2"); // let val = sheet.getRange("A1:B50" ).setValue(result); // }}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/18 15:00

let result = JSON.parse(response.getContentText()); の直後に  Console.log(result); を入れて実行したとき、ログウィンドウに何かデータは表示されますか?
pon244

2021/06/18 15:20

表示されてないので、うまく取れてないんだと思います、、、 どうしたらとれるでしょうか。
退会済みユーザー

退会済みユーザー

2021/06/18 15:30 編集

responseのデータがないということは、twitter認証そのものに問題がありそうですね。 const service = getService(); の直後に Logger.log(service.hasAccess());を入れて実行してみてください。 ログウィンドウにfalseと表示されるならば、認証が通っていません。 可能性として 1.APIキーやsecretが誤っている。(有効でない) 2.認証させるための手順が誤っている 事が考えられます。 1については再度確認していただくとして、2についてはコード全体を見ないとアドバイスが難しいです。 APIキー等はダミー文字列にしてよいので、認証の部分を含めた「すべてのコード」を質問文に追加していただけないでしょうか。
pon244

2021/06/18 15:45

コードを修正しました! authCallback(request)のとこで  TypeError: Cannot read property "parameter" from undefined. のエラーが出ております。
退会済みユーザー

退会済みユーザー

2021/06/19 08:03 編集

authCallback(request)関数を直接実行されたのでしょうか? authCallback(request)関数を直接実行すると、必ずTypeError: Cannot read property "parameter" from undefined.が出てしまうと思います。 authCallback(request)関数は直接実行するものではありません。 ただし、authCallback(request)を直接実行していなくとも、APIキーが間違っていたり、正しい手順で認証していない場合同様のエラーが出る場合があります。 上記のコードの場合ですと、正しい認証手順は以下になります。(APIキーやsecret、Twitter Developerサイトでの各種設定は正しくなされている前提です) 1. スクリプトエディタで、getOAuthURL() 関数を実行します。 2. apiキーやTwitter APIの設定等の諸々が正常であれば、ログウィンドウに、https://~で始まるurlが表示されるはずなので、そのURLをコピーして、ブラウザの(スクリプトエディタが表示されているタブとは別タブの)アドレス欄に貼り付けて、エンターキーを押します。 3. Twitterのアプリ連携のページが開くので、「連携アプリを認証」ボタンを押します。 4.アプリ連携が正常に完了すると、ページが遷移して、左上に小さく「SUCCESS!!」と表示されるはずです。 ここまでやって正常にTwitter APIをGoogleスクリプト上で使える状態になります。 5.getTrends()関数を実行します。
pon244

2021/06/19 07:26

ありがとうございます! いただいた手順でしてみたら数値としては {as_of=2021-06-19T07:24:20Z, locations=[Ljava.lang.Object;@6, created_at=2021-06-18T21:11:28Z, trends=[Ljava.lang.Object;@648d} みたいな感じで値は取れたのですが、文字だけとかはできるのでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/19 07:38

すみません、「文字だけ」とは具体的にはどういうデータを意味しているのでしょうか。 元の質問文のソースコードは「sheet.getRange("A1:B50" ).setValue(result)」となっていて A1セルからB50にresultを入力するという意味だと解釈しております。 そして、resultはすなわち「{as_of=2021-06-19T07:24:20Z, locations=[Ljava.lang.Object;@6, created_at=2021-06-18T21:11:28Z, trends=[Ljava.lang.Object;@648d}」という文字列になります。 表示したいのがこの「result」ではないとしたら、スプレッドシートのA1:B50セルに、具体的に「どのようなデータ」を表示したいのでしょうか。というのを教えていただかないと、具体的なコードの教示のしようもありません・・・
pon244

2021/06/19 07:44

曖昧な説明で申し訳ございません! console.log(result[0]);で下記のようなものを出ました。 下記の部分のNameの隣のハッシュタグや文字を sheet.getRange("A1:A50" )に格納したいです! Logging output too large. Truncating output. { trends: [ { name: '#リッスン', url: 'http://twitter.com/search?q=%23%E3%83%AA%E3%83%83%E3%82%B9%E3%83%B3', promoted_content: null, query: '%23%E3%83%AA%E3%83%83%E3%82%B9%E3%83%B3', tweet_volume: null },
退会済みユーザー

退会済みユーザー

2021/06/19 07:55

回答を記入しました。
pon244

2021/06/19 08:01

できました! ありがとうございます!!
guest

回答1

0

ベストアンサー

「Trend2」という名前のシートのA列にハッシュタグ、B列にURLを表示する例です。

(下記コードはスプレッドシート紐付きのスクリプト(コンテナバインド型)で有効。
「TypeError: Cannot read property 'getSheetByName' of null」が表示される場合は、const ss = SpreadsheetApp.getActiveSpreadsheet();の行を「const ss = SpreadsheetApp.openById(スプレッドシートID)」に変えること。)

function getOAuthURL() { Logger.log(getService().authorize()); } // サービス取得 function getService() { return OAuth1.createService('Twitter') .setAccessTokenUrl('https://api.twitter.com/oauth/access_token') .setRequestTokenUrl('https://api.twitter.com/oauth/request_token') .setAuthorizationUrl('https://api.twitter.com/oauth/authorize') // 設定した認証情報をセット .setConsumerKey(PropertiesService.getScriptProperties().getProperty("CONSUMER_API_KEY")) .setConsumerSecret(PropertiesService.getScriptProperties().getProperty("CONSUMER_API_SECRET")) .setCallbackFunction('authCallback') // 認証情報をロパティストアにセット(これにより認証解除するまで再認証が不要になる) .setPropertyStore(PropertiesService.getUserProperties()); } // 認証成功時に呼び出される処理を定義 function authCallback(request) { var service = getService(); var authorized = service.handleCallback(request); if (authorized) { return HtmlService.createHtmlOutput('success!!'); } else { return HtmlService.createHtmlOutput('failed'); } } function getTrends(){ const service = getService(); if (service.hasAccess()) { // id=1118370 を指定することで、東京のトレンドを取得 const url = 'https://api.twitter.com/1.1/trends/place.json?id=1118370'; const response = service.fetch(url, { method: 'get' }); const result = JSON.parse(response.getContentText()); const trends = result[0].trends; const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("Trend2"); sheet.getRange("A1:B"+trends.length).setValues(trends.map(e=>[e.name, e.url])); } else { Logger.log("認証エラー"); } }

投稿2021/06/19 07:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問