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

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

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

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

Q&A

1回答

185閲覧

スプシからテキストと画像を取得しスレッズで投稿したいが実行が難しい

0318

総合スコア1

Google Apps Script

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

0グッド

1クリップ

投稿2024/09/07 11:50

実現したいこと

GASを使ってSpreadsheetに投稿したい内容をひぱってきて、書き起こすことは出来ました。
しかし投稿する手順でうまくいきません。
ChatGPTでもたくさん調べたのですが良い答えが出てこず。。。
プログラミング初めて1週間程度しか立ってない雑魚ですがアドバイスお願いします。
ここに実現したいことを箇条書きで書いてください。

function getRandomImagesAndWriteToSpreadsheet() {
try {
// 画像が保存されているフォルダーのIDを指定
var folderId = '未記入'; // フォルダーIDを指定してください
var folder = DriveApp.getFolderById(folderId);

// フォルダー内のファイルを取得 var files = folder.getFiles(); var imageFiles = []; // フォルダー内の画像ファイルを配列に格納 while (files.hasNext()) { var file = files.next(); var mimeType = file.getMimeType(); // 画像の MIME タイプをチェック(一般的な画像 MIME タイプ) if (mimeType.startsWith('image/')) { imageFiles.push({ name: file.getName(), id: file.getId() }); } } // 画像があるか確認 if (imageFiles.length > 0) { // 1~2枚のランダム枚数を決定 var numImagesToSelect = Math.floor(Math.random() * 2) + 1; // 1 または 2 をランダムに生成 Logger.log('Number of images to select: ' + numImagesToSelect); // シャッフルしてランダムな画像を選択 var selectedImages = []; for (var i = 0; i < numImagesToSelect; i++) { if (imageFiles.length > 0) { var randomIndex = Math.floor(Math.random() * imageFiles.length); var randomImage = imageFiles.splice(randomIndex, 1)[0]; // 選んだ画像を配列から削除 var randomImageUrl = "https://drive.google.com/uc?id=" + randomImage.id; selectedImages.push(randomImageUrl); } } // スプレッドシートに書き込む処理 var spreadsheetId = '未記入'; // スプレッドシートIDを指定してください var sheet = SpreadsheetApp.openById(spreadsheetId).getActiveSheet(); // 選択した画像URLをC列に書き込み if (selectedImages.length == 1) { sheet.getRange('C1').setValue(selectedImages[0]); // 1枚目をC1に書き込む } else if (selectedImages.length == 2) { sheet.getRange('C1').setValue(selectedImages[0]); // 1枚目をC1に書き込む sheet.getRange('C2').setValue(selectedImages[1]); // 2枚目をC2に書き込む } // ログ出力 selectedImages.forEach(function(imageUrl, index) { Logger.log('Selected Image ' + (index + 1) + ' URL: ' + imageUrl); }); // 10秒後にセルをクリアするトリガーをセット ScriptApp.newTrigger('clearSpreadsheetCells') .timeBased() .after(10000) // 10秒後に実行 .create(); } else { Logger.log('No images found in the specified folder.'); }

} catch (error) {
Logger.log('Error: ' + error.toString());
}
}

function clearSpreadsheetCells() {
try {
var spreadsheetId = '未記入'; // スプレッドシートIDを指定してください
var sheet = SpreadsheetApp.openById(spreadsheetId).getActiveSheet();

// C1とC2のセルをクリア sheet.getRange('C1:C2').clearContent(); Logger.log('Cells C1 and C2 cleared.'); // 現在のトリガーを削除する var triggers = ScriptApp.getProjectTriggers(); triggers.forEach(function(trigger) { if (trigger.getHandlerFunction() === 'clearSpreadsheetCells') { ScriptApp.deleteTrigger(trigger); } });

} catch (error) {
Logger.log('Error: ' + error.toString());
}
}

// ランダムなテキストを取得してログに表示
function myFunction() {
var spreadsheetId = '未記入'; // こちらも指定が必要
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheets = spreadsheet.getSheets();

for (var i = 0; i < sheets.length; i++) {
var sheet = sheets[i];
var lastRow = sheet.getLastRow();

// A2から最終行までのデータを取得 var range = sheet.getRange('A2:A' + lastRow); var data = range.getValues(); var texts = data.map(function(shiba){ return shiba[0]; }); // ランダムなテキストを取得 var randomIndex = Math.floor(Math.random() * texts.length); var randomText = texts[randomIndex]; // ログにランダムテキストを出力 Logger.log('Selected Random Text: ' + randomText); return randomText;

}
}

// myFunction から getRandomImagesAndWriteToSpreadsheet を呼び出す例
function main() {
var randomText = myFunction(); // ランダムテキストを取得
Logger.log('Random Text: ' + randomText);

// 画像選択関数の呼び出し
var selectedImages = getRandomImagesAndWriteToSpreadsheet();

// 選択された画像があるか確認
if (selectedImages.length > 0) {
var imageUrl = selectedImages[0]; // 最初の画像URLをimageUrlとして使用
} else {
Logger.log('No images selected.');
return; // 画像が選ばれていない場合は終了
}

var postPayload = {
"media_url": imageUrl,
"text": randomText
};

// 残りのコードはそのまま
var postOptions = {
method: 'post',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + accessToken
},
payload: JSON.stringify(postPayload)
};

// APIエンドポイントへのPOSTリクエスト
var response = UrlFetchApp.fetch("https://graph.threads.net/v1.0/me/threads", postOptions);
var postResponse = JSON.parse(response.getContentText());
var creationId = postResponse.id; // 下書き投稿のIDを取得
Logger.log("Draft Post ID: " + creationId);

// 一定時間停止
Utilities.sleep(5000);

// =============== 下書き投稿を公開するところ ===============
var publishPayload = {
"creation_id": creationId
};

var publishOptions = {
method: 'post',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + accessToken
},
payload: JSON.stringify(publishPayload)
};

// 投稿公開リクエスト
var publishResponse = UrlFetchApp.fetch('https://graph.threads.net/v1.0/me/threads_publish', publishOptions);
var publishData = JSON.parse(publishResponse.getContentText());
var postId = publishData.id; // 投稿されたポストのIDを取得
Logger.log("Published Post ID: " + postId);

// =============== リプライを下書き投稿するところ ===============
var replyPayload = {
"text": "リプライのテキスト",
"media_type": "TEXT",
"reply_to_id": postId
};

var replyOptions = {
method: 'post',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + accessToken
},
payload: JSON.stringify(replyPayload)
};

// リプライの下書き投稿
var replyResponse = UrlFetchApp.fetch("https://graph.threads.net/v1.0/me/threads", replyOptions);
var replyData = JSON.parse(replyResponse.getContentText());
var replyId = replyData.id;
Logger.log("Reply Draft ID: " + replyId);

// 一定時間停止
Utilities.sleep(5000);

// =============== リプライの下書き投稿を公開するところ ===============
var publishReplyPayload = {
"creation_id": replyId
};

var publishReplyOptions = {
method: 'post',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + accessToken
},
payload: JSON.stringify(publishReplyPayload)
};

// リプライの公開リクエスト
var publishReplyResponse = UrlFetchApp.fetch('https://graph.threads.net/v1.0/me/threads_publish', publishReplyOptions);
Logger.log(publishReplyResponse.getContentText());

Logger.log('============ 一つのシートの処理が終わりました ========');

前提

実行するとこのようなエラーが出てしまいます。TypeError: Cannot read properties of undefined (reading 'length')
main @ コード.gs:136

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

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

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

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

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

odataiki

2024/09/11 08:23

現在の質問文だと回答者側にとって非常に読みにくい状態であり 質問内容を検証しようという気が削がれてしまい回答が集まらないように感じます。 提示頂いているソースコードの表示が コード形式と地の文で入り混じっています。 コードはコード形式で表示していただくと、 回答側も検証がしやすく回答が集まると思います。
guest

回答1

0

エラーの原因はgetRandomImagesAndWriteToSpreadsheetの関数が値を何も返していないのに
var selectedImages = getRandomImagesAndWriteToSpreadsheet();と戻り値を格納し
if (selectedImages.length > 0) {とその戻り値が配列であることを期待して処理しようとしているためです。

実行してもselectedImagesの中身は空っぽで何も入っていません。

貴方がgetRandomImagesAndWriteToSpreadsheetという関数の結果として何を期待しているのかをそれ以降のコードで推測すると選択した画像のURLが格納された配列だと思われます。
そうなのであれば、その選択した画像のURLが格納された配列をgetRandomImagesAndWriteToSpreadsheetにて返すようにしてください。

投稿2024/09/07 23:10

YAmaGNZ

総合スコア10514

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問