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

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

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

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

Q&A

1回答

274閲覧

GASのTwitter自動投稿システムで画像が空白のときの処理がわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

1クリップ

投稿2023/10/26 06:27

編集2023/10/26 06:45

実現したいこと

・Twitterの自動投稿システムを作りたい
・画像がセルに用意されているときは画像投稿
・画像が用意されていない場合は投稿文だけ投稿

前提

画像無しの場合このようなエラーが出されます

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

なし

Exception: Cannot retrieve the next object: iterator has reached the end.

該当のソースコード

function tweet() { const twitter = getTwitterService() if(twitter.hasAccess()) { const endpoint1 = "https://upload.twitter.com/1.1/media/upload.json" const endpoint2 = "https://api.twitter.com/2/tweets"; // シートの指定 var sheet = SpreadsheetApp.getActiveSheet(); // 投稿内容の取得 var img = sheet.getRange(2, 1).getValue(); var text = sheet.getRange(2, 3).getValue(); var file_name = img; //画像ファイル名を設定 if(file_name != ""){ var file_temp = DriveApp.getFilesByName(file_name).next();//GoogleDriveから画像を取得 } else { file_temp = ""; } // 画像をアップロードできる様に(ここから) var resp = file_temp.getBlob(); var resp_64 = Utilities.base64Encode(resp.getBytes());//Blobを経由してBase64に変換 var img_option = { 'method':"POST", 'payload':{'media_data':resp_64} }; var image_repsponse = twitter.fetch(endpoint1,img_option); var image_result = JSON.parse(image_repsponse.getContentText()); // 画像をアップロードできる様に(ここまで) // テキスト関連 var twitterText = text; //ツイートテキストを設定 var mediainfo = { media_ids: [image_result['media_id_string']] } var payload = { text: twitterText, media: mediainfo } var response = twitter.fetch(endpoint2, { method: "post", muteHttpExceptions: true, payload: JSON.stringify(payload), contentType: "application/json" }); var result = JSON.parse(response.getContentText()); console.log(image_result + twitterText); } else { Logger.log(service.getLastError()) } sheet.deleteRow(2); }

###試したこと
エラーの意味も何故出るかもわかっており、条件分岐の中にアップロードなどの処理を入れたりしてみたのですがその場合だとエラーは出ませんがなぜか投稿もされません

var resp = file_temp.getBlob(); var resp_64 = Utilities.base64Encode(resp.getBytes());//Blobを経由してBase64に変換 var img_option = { 'method':"POST", 'payload':{'media_data':resp_64} }; var image_repsponse = twitter.fetch(endpoint1,img_option); var image_result = JSON.parse(image_repsponse.getContentText());

を条件分岐の中に入れてみたりしました

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/10/26 06:44

すみません 試したことは前提に書いておりました
YellowGreen

2023/10/26 07:13

そのようなエラーが出そうなのは、 var file_temp = DriveApp.getFilesByName(file_name).next(); のところですが、 if (file_name != "") { のときなので、 可能性としてはA2セルが消去されておらず、スペースが入力されている場合 などでしょうか。
退会済みユーザー

退会済みユーザー

2023/10/26 07:40

コメントありがとうございます 試しましたが同じ結果でした
YellowGreen

2023/10/26 09:00

エラーにソースの行数が併せて表示されていませんか?
退会済みユーザー

退会済みユーザー

2023/10/26 11:53

Exception: Cannot retrieve the next object: iterator has reached the end. tweet @ 自動投稿.gs:24 となっております 意味もなぜ出るかもわかってはいます いろんな部分を条件分岐に入れているうちにわけがわからなくなってしまって・・・。
guest

回答1

0

payloadにイメージを設定する箇所がありますから、それらも条件分岐で作成するべきかと思います。

JavaScript

1 // テキスト関連 2 var twitterText = text; //ツイートテキストを設定 3 4 if(file_name != ""){ 5 var file_temp = DriveApp.getFilesByName(file_name).next();//GoogleDriveから画像を取得 6 // 画像をアップロードできる様に(ここから) 7 var resp = file_temp.getBlob(); 8 var resp_64 = Utilities.base64Encode(resp.getBytes());//Blobを経由してBase64に変換 9 10 var img_option = { 'method':"POST", 'payload':{'media_data':resp_64} }; 11 var image_repsponse = twitter.fetch(endpoint1,img_option); 12 var image_result = JSON.parse(image_repsponse.getContentText()); 13 14 var mediainfo = { 15 media_ids: [image_result['media_id_string']] 16 } 17 var payload = { 18 text: twitterText, 19 media: mediainfo 20 } 21 // 画像をアップロードできる様に(ここまで) 22 } else { 23 var payload = { 24 text: twitterText 25 } 26 } 27

コメントにて提示いただいたコードを必要部分のみにして実行してみましたが、正常にポストされました。

JavaScript

1function tweettest() { 2 const twitter = getTwitterService() 3 4 if(twitter.hasAccess()) { 5 6 const endpoint2 = "https://api.twitter.com/2/tweets"; 7 8 // 投稿内容の取得 9 var text = 'ポストテスト'; 10 var file_name = ''; //画像ファイル名を設定 11 12 // テキスト関連 13 var twitterText = text; //ツイートテキストを設定 14 if(file_name != ""){ 15 var file_temp = DriveApp.getFilesByName(file_name).next();//GoogleDriveから画像を取得 16 // 画像をアップロードできる様に(ここから) 17 var resp = file_temp.getBlob(); 18 var resp_64 = Utilities.base64Encode(resp.getBytes());//Blobを経由してBase64に変換 19 20 var img_option = { 'method':"POST", 'payload':{'media_data':resp_64} }; 21 var image_repsponse = twitter.fetch(endpoint1,img_option); 22 var image_result = JSON.parse(image_repsponse.getContentText()); 23 24 var mediainfo = { 25 media_ids: [image_result['media_id_string']] 26 } 27 var payload = { 28 text: twitterText, 29 media: mediainfo 30 } 31 // 画像をアップロードできる様に(ここまで) 32 } else { 33 var payload = { 34 text: twitterText 35 } 36 } 37 38 var response = twitter.fetch(endpoint2, { 39 method: "post", 40 muteHttpExceptions: true, 41 payload: JSON.stringify(payload), 42 contentType: "application/json" 43 }); 44 45 var result = JSON.parse(response.getContentText()); 46 47 console.log(image_result + twitterText); 48 49 } else { 50 Logger.log(service.getLastError()) 51 } 52 53} 54

投稿2023/10/26 09:00

編集2023/10/27 07:34
YAmaGNZ

総合スコア10544

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

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

退会済みユーザー

退会済みユーザー

2023/10/26 11:57

ご回答ありがとうございます! 書いていただいたものを試したところ画像が無しの場合はエラーは吐きませんが投稿がされないという感じです 画像がある場合は問題なく投稿されました
YAmaGNZ

2023/10/26 12:17

確認ですが画像なしの場合はfetchで渡しているpayloadにはmediaの情報が入っていない状態ですよね? 私が提示したのはpayloadの作成をif文のほうに移したコードですが、前の位置にpayloadの設定が残っていたりしませんよね?
退会済みユーザー

退会済みユーザー

2023/10/27 07:20

ご返信ありがとうございます 前の位置には残っておりません 念のためにコード掲載しておきます function tweet() { const twitter = getTwitterService() if(twitter.hasAccess()) { const endpoint1 = "https://upload.twitter.com/1.1/media/upload.json" const endpoint2 = "https://api.twitter.com/2/tweets"; // シートの指定 var sheet = SpreadsheetApp.getActiveSheet(); // 投稿内容の取得 var img = sheet.getRange(2, 1).getValue(); var text = sheet.getRange(2, 3).getValue(); var file_name = img; //画像ファイル名を設定 // var file_temp = DriveApp.getFilesByName(file_name).next();//GoogleDriveから画像を取得 // 画像をアップロードできる様に(ここから) var resp = file_temp.getBlob(); var resp_64 = Utilities.base64Encode(resp.getBytes());//Blobを経由してBase64に変換 var img_option = { 'method':"POST", 'payload':{'media_data':resp_64} }; var image_repsponse = twitter.fetch(endpoint1,img_option); var image_result = JSON.parse(image_repsponse.getContentText()); // 画像をアップロードできる様に(ここまで) // テキスト関連 var twitterText = text; //ツイートテキストを設定 if(file_name != ""){ var file_temp = DriveApp.getFilesByName(file_name).next();//GoogleDriveから画像を取得 // 画像をアップロードできる様に(ここから) var resp = file_temp.getBlob(); var resp_64 = Utilities.base64Encode(resp.getBytes());//Blobを経由してBase64に変換 var img_option = { 'method':"POST", 'payload':{'media_data':resp_64} }; var image_repsponse = twitter.fetch(endpoint1,img_option); var image_result = JSON.parse(image_repsponse.getContentText()); var mediainfo = { media_ids: [image_result['media_id_string']] } var payload = { text: twitterText, media: mediainfo } // 画像をアップロードできる様に(ここまで) } else { var payload = { text: twitterText } } var response = twitter.fetch(endpoint2, { method: "post", muteHttpExceptions: true, payload: JSON.stringify(payload), contentType: "application/json" }); var result = JSON.parse(response.getContentText()); console.log(image_result + twitterText); } else { Logger.log(service.getLastError()) } sheet.deleteRow(2); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問