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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Twitter

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

解決済

TwitterAPIから取得したツイート本文中の複数URLをGoogleスプレッドシートに保存できない(Google Apps Script)

blue_blacks
blue_blacks

総合スコア8

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Twitter

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

1回答

0評価

0クリップ

1307閲覧

投稿2021/01/04 11:21

編集2021/01/04 11:23

いつもお世話になります。TwitterAPIからツイートデータを取得してスプレッドシートに保存するGASコードを他サイト等のサンプルと手がかりに作成しましたが、下記の点が実行できないことから、コードの記述方法等ご教示頂ければ幸いです(詳細は下記コードの★該当部分★をご確認下さい)

・ツイート本文中のメディアファイルのリンクURLについて、ツイート中に複数のリンクがある場合
に、最初のURLしか保存できない
・ツイート内のメディアファイル以外のURLについても保存したい

Google

var SCREEN_NAME_FIRST = "hogehoge" var CONSUMER_KEY = " "; var CONSUMER_SECRET = " "; var PROJECT_KEY = " "; var API_USER_TIMELINE = "https://api.twitter.com/1.1/statuses/user_timeline.json"; var API_USER_LOOKUP = "https://api.twitter.com/1.1/users/lookup.json"; var API_URL_TIMELINE = "https://api.twitter.com/1.1/statuses/home_timeline.json" var SHEET_NAME = "Tweetsave" var LIMIT_COUNT = 200; var CREATED_AT = 1; var USERNAME = 2; var USERSNAME = 3; var TWEETID = 4; var TEXT = 5; var RETWEET_COUNT = 6; var FAVORITE_COUNT = 7; var ENTITIES_URL = 8; var ENTITIES_MEDIA = 9; var URL = 10; function getTwitterService() { var service = OAuth1.createService("twitter"); service.setAccessTokenUrl("https://api.twitter.com/oauth/access_token") service.setRequestTokenUrl("https://api.twitter.com/oauth/request_token") service.setAuthorizationUrl("https://api.twitter.com/oauth/authorize") service.setConsumerKey(CONSUMER_KEY); service.setConsumerSecret(CONSUMER_SECRET); service.setProjectKey(PROJECT_KEY); service.setCallbackFunction("authCallback"); service.setPropertyStore(PropertiesService.getScriptProperties()); return service; } function authCallback(request) { var service = getTwitterService(); var isAuthorized = service.handleCallback(request); if(isAuthorized) { return HtmlService.createHtmlOutput("Success! You can close this page."); } else { return HtmlService.createHtmlOutput("Denied. You can close this page"); } } function getuserTweetsfirst() { Logger.log("[START] getuserTweetsfirst()"); var service = getTwitterService(); if(service.hasAccess()) { try { var as = SpreadsheetApp.getActiveSpreadsheet(); var tws = as.getSheetByName(SCREEN_NAME_FIRST); // tweetシート var iRow = 1; // 書き込む行数の開始位置 var lookup = usersLookup(SCREEN_NAME_FIRST); // /users/lookup.json var statusesCount = Math.floor(lookup.statuses_count); // 全ツイート数 var division = Math.floor(statusesCount / LIMIT_COUNT); // 全ツイートを200で割る除算 var remain = Math.floor(statusesCount % LIMIT_COUNT); // 全ツイートを200で割る剰余算 var apiRequestCount = remain == 0 ? division : division + 1; // APIのリクエスト数 var max_id = ""; var since_id = "" var apiUrl = API_USER_TIMELINE + "?screen_name=" + SCREEN_NAME_FIRST + "&count=" + LIMIT_COUNT + "&since_id=" + since_id; Logger.log("statusesCount = " + statusesCount); Logger.log("apiRequestCount = " + apiRequestCount); for(var i = 0; i < apiRequestCount; i++) { var url = max_id != "" ? apiUrl + "&max_id=" + max_id : apiUrl; var response = service.fetch(url); var tweets = JSON.parse(response.getContentText()); if (tweets.length < 1) { break; } max_id = decStrNum(tweets[tweets.length -1].id_str); Logger.log("tweets = " + tweets.length); Logger.log("max_id = " + max_id); for(var ii = 0; ii < tweets.length; ii++) { var d = new Date(tweets[ii].created_at); tws.getRange(iRow, CREATED_AT ).setValue(Utilities.formatDate(d, "JST", "yyyy-MM-dd HH:mm:ss")); tws.getRange(iRow, USERNAME ).setValue(tweets[ii].user.name); tws.getRange(iRow, USERSNAME ).setValue(tweets[ii].user.screen_name); tws.getRange(iRow, TWEETID ).setValue(tweets[ii].id_str); tws.getRange(iRow, TEXT ).setValue(tweets[ii].text); tws.getRange(iRow, RETWEET_COUNT ).setValue(tweets[ii].retweet_count); tws.getRange(iRow, FAVORITE_COUNT).setValue(tweets[ii].favorite_count); var media = new Array(); //★該当部分★ media = tweets[ii].entities.media; if(media instanceof Array) { Logger.log("media.length = " + media.length); var media_url = []; for(var iii = 0; iii < media.length; iii++) { media_url.push(media[iii].media_url_https);  tws.getRange(iRow, ENTITIES_MEDIA).setValue(media_url.join('\n')); } } tws.getRange(iRow, URL).setValue("https://twitter.com/" + SCREEN_NAME + "/status/" + tweets[ii].id_str); iRow++; //★該当部分★ } } } catch(e) { Logger.log("[ERROR] getAllTweetsfirst() : " + e.message); MailApp.sendEmail("daiisi.0001@gmail.com", "[ERROR] getAllTweetsfirst()", e.message); } } else { var authorizationUrl = service.authorize(); Logger.log("Please visit the following URL and then re-run the script: " + authorizationUrl); } Logger.log("[END] userTweetsfirst()"); } function usersLookup(screen_name) { var service = getTwitterService(); if(service.hasAccess()) { var url = API_USER_LOOKUP + "?screen_name=" + screen_name; var response = service.fetch(url); var tweets = JSON.parse(response.getContentText()); return tweets[0] } else { var authorizationUrl = service.authorize(); Logger.log("Please visit the following URL and then re-run the script: " + authorizationUrl); } } /* * Decreasing 64-bit Tweet ID */ function decStrNum(n) { n = n.toString(); var result = n; var i = n.length - 1; while(i > -1) { if(n[i] === "0") { result = result.substring(0, i) + "9" + result.substring(i + 1); i --; } else { result = result.substring(0, i) + (parseInt(n[i], 10) -1).toString() + result.substring(i + 1); return result; } } return result; } function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var menuEntries = [ {name: "Tweetをダウンロード", functionName: "getAllTweets"} ]; ss.addMenu("スクリプト",menuEntries);

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

退会済みユーザー

退会済みユーザー

2021/01/17 00:01

すいません、ツイッターのAPIの申請してなくて、 回答というよりは質問に対する質問になります。 tws.getRange(iRow, ENTITIES_MEDIA).setValue(media_url.join('\n')); 上記セルに対する値がおかしいという理解で良いでしょうか?

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Twitter

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