【したいこと】
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); // }}
let result = JSON.parse(response.getContentText());
の直後に
Console.log(result);
を入れて実行したとき、ログウィンドウに何かデータは表示されますか?
表示されてないので、うまく取れてないんだと思います、、、
どうしたらとれるでしょうか。
responseのデータがないということは、twitter認証そのものに問題がありそうですね。
const service = getService();
の直後に
Logger.log(service.hasAccess());を入れて実行してみてください。
ログウィンドウにfalseと表示されるならば、認証が通っていません。
可能性として
1.APIキーやsecretが誤っている。(有効でない)
2.認証させるための手順が誤っている
事が考えられます。
1については再度確認していただくとして、2についてはコード全体を見ないとアドバイスが難しいです。
APIキー等はダミー文字列にしてよいので、認証の部分を含めた「すべてのコード」を質問文に追加していただけないでしょうか。
コードを修正しました!
authCallback(request)のとこで TypeError: Cannot read property "parameter" from undefined.
のエラーが出ております。
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()関数を実行します。
ありがとうございます!
いただいた手順でしてみたら数値としては
{as_of=2021-06-19T07:24:20Z, locations=[Ljava.lang.Object;@6, created_at=2021-06-18T21:11:28Z, trends=[Ljava.lang.Object;@648d}
みたいな感じで値は取れたのですが、文字だけとかはできるのでしょうか?
すみません、「文字だけ」とは具体的にはどういうデータを意味しているのでしょうか。
元の質問文のソースコードは「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セルに、具体的に「どのようなデータ」を表示したいのでしょうか。というのを教えていただかないと、具体的なコードの教示のしようもありません・・・
曖昧な説明で申し訳ございません!
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 },
回答を記入しました。
できました!
ありがとうございます!!
回答1件
あなたの回答
tips
プレビュー