実現したいこと
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