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

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

新規登録して質問してみよう
ただいま回答率
85.30%
Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Q&A

1回答

1579閲覧

Google apps scriptにてスプレッドシートの値を取得したいがエラーが出てしまい先に進めません

fujitom

総合スコア1

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

0グッド

0クリップ

投稿2022/02/19 04:56

Google apps scriptに関して質問させていただきます。
初心者ですが、ネットを参考にGoogle Driveにファイルが追加や削除が行われた際に、指定した宛先にメールを送るスクリプトを作成しております。

参考にしたサイト

実行したところ、下記エラーが生じされて先に進めない状況です。

表示されるエラー
『オブジェクトSpreadsheetAppでメソッドまたはプロパティopenByIdを取得中に予期しないエラーが発生しました。』
イメージ説明

何方か解決策をご教授いただけますでしょうか?
よろしくお願いいたします。

作成したソースコード

//対象とするGoogleDriveフォルダのID ブラウザでアクセスしてURL見れば分かる var PHOTO_FOLDER_ID = "******************************"; //更新日時を記録するのスプレッドシートのID ブラウザでアクセスしてURL見れば分かる var UPDATE_SHEET_ID = "******************************"; //スプレッドシートのシート名(下に表示されるタブのやつ) var UPDATE_SHEET_NAME = "******************************"; //宛先 var SEND_MAIL_ADDRESS = ["*******@********", "**********@gmail.com"] //送り主 var SENDER_MAIL_ADDRESS = ["**********@gmail.com"] //フォルダ内を再帰的に探索してすべてのファイルIDを配列にして返す function getAllFilesId(targetFolder) { var filesIdList = []; var files = targetFolder.getFiles(); while (files.hasNext()) { filesIdList.push(files.next().getId()); } var child_folders = targetFolder.getFolders(); while (child_folders.hasNext()) { var child_folder = child_folders.next(); filesIdList = filesIdList.concat(getAllFilesId(child_folder)); } return filesIdList; } function updateCheck() { var photoFolder = DriveApp.getFolderById(PHOTO_FOLDER_ID); var folders = photoFolder.getFolders(); var folderData = {}; // 写真フォルダ配下の最終更新日時を取得。 while (folders.hasNext()) { var folder = folders.next(); // フォルダ最終更新日時 var lastFolderUpdateDate = folder.getLastUpdated(); // フォルダ内のファイルの最終更新日時が新しい場合もあるのでそれに対応 var files = folder.getFiles(); while (files.hasNext()) { var fileobj = files.next(); if (fileobj.getLastUpdated() > lastFolderUpdateDate) { // Logger.log("update LastUpdated: " + lastFolderUpdateDate + ", " + fileobj.getLastUpdated()) lastFolderUpdateDate = fileobj.getLastUpdated(); } } // 情報を連想配列に格納 folderData[folder.getName()] = { name: folder.getName(), lastUpdate: lastFolderUpdateDate, // フォルダ最終更新日時 filenum: getAllFilesId(folder).length, // フォルダ内のファイル数 url: folder.getUrl(), // フォルダのURL diff: 0 }; } // スプレッドシートに記載されているフォルダ名と更新日時を取得。 var spreadsheet = SpreadsheetApp.openById(UPDATE_SHEET_ID); ← ここでエラー発生 var sheet = spreadsheet.getSheetByName(UPDATE_SHEET_NAME); var data = sheet.getDataRange().getValues(); // 取得したデータをMapに変換。 var sheetData = {}; // headerがあるので2から開始 for (var i = 1; i < data.length; i++) { sheetData[data[i][0]] = { name: data[i][0], lastUpdate: data[i][1], filenum: data[i][2], url: data[i][3], rowNo: i + 1 }; } // 実際のフォルダとスプレッドシート情報を比較。 var updateFolderList = []; for (key in folderData) { if (key in sheetData) { // フォルダ名がシートに存在する場合。 if (folderData[key].lastUpdate > sheetData[key].lastUpdate | folderData[key].filenum != sheetData[key].filenum) { // フォルダが更新されているか、ファイルが追加されている場合。 updateFolderList.push(key); folderData[key].diff = folderData[key].filenum - sheet.getRange(sheetData[key].rowNo, 3).getValue(); Logger.log(key+", folderData[key].diff: " + folderData[key].diff); sheet.getRange(sheetData[key].rowNo, 2).setValue(folderData[key].lastUpdate); sheet.getRange(sheetData[key].rowNo, 3).setValue(folderData[key].filenum); sheet.getRange(sheetData[key].rowNo, 4).setValue(folderData[key].url); } } else { // フォルダ名がシートに存在しない場合。 var lowno = sheet.getLastRow() + 1 sheet.getRange(lowno, 1).setValue(key); sheet.getRange(lowno, 2).setValue(folderData[key].lastUpdate); sheet.getRange(lowno, 3).setValue(folderData[key].filenum); sheet.getRange(lowno, 4).setValue(folderData[key].url); updateFolderList.push(key); } } // 削除されたフォルダをチェックして、フォルダ一覧から削除 var deleteFolderList = []; for (key in sheetData) { if (!(key in folderData)) { Logger.log(key + " is deleted. row" + sheetData[key].rowNo) sheet.deleteRow(sheetData[key].rowNo) deleteFolderList.push(key); } } // 新規及び更新された情報をメール送信 if (updateFolderList.length != 0 | deleteFolderList.length != 0) { var bodyText = photoFolder.getName() + "フォルダに、" + updateFolderList.length + "個のフォルダが追加(変更)されました。\n"; bodyText += photoFolder.getUrl() + "\n\n"; // フォルダ名、フォルダ更新日時、フォルダ内のファイル数 if (updateFolderList != 0) { bodyText += "フォルダ名 \t枚数\tURL\n"; for (key in updateFolderList) { fld = updateFolderList[key]; bodyText += fld + "\t" + folderData[fld].filenum; if (folderData[fld].diff != 0) { //変更されたフォルダがある場合 bodyText += "(" + folderData[fld].diff + ")"; } bodyText += "枚" + "\t" + folderData[fld].url + "\n"; } } if (deleteFolderList != 0) { bodyText += "\n以下のフォルダが削除されています。" + "\n"; for (key in deleteFolderList) { fld = deleteFolderList[key]; bodyText += fld + "\t" + sheetData[fld].filenum + "枚" + "\n"; } } bodyText += "\n\nこのメールに返信しても見れませんので返信しないでください。"; // Logger.log(bodyText) var titletext = "共有ファイル【" + photoFolder.getName() + "】更新連絡通知"; MailApp.sendEmail(DIST_MAIL_ADDRESS, SENDER_MAIL_ADDRESS, titletext, bodyText); } else { Logger.log("通知する更新情報がありません") } }

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

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

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

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

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

guest

回答1

0

ご質問のエラーは、IDを正しくコピペできていないことが原因と思われます。

私の環境では、「← ここでエラー発生」の文字列がコメントでなかった部分と以下の点を修正して、エラーなく動作しています。

以下の点を修正する必要があると思います。

  1. SEND_MAIL_ADDRESSが配列になっていますが、各アドレスを配列から取り出してsendEmailの引数としているDIST_MAIL_ADDRESSに代入する処理がない。
  2. sendEmailの引数(recipient, subject, body, options)に送信元のアドレス(SENDER_MAIL_ADDRESS)は直接指定できない。こちらも配列になっているので利用するには配列から取り出す処理が必要です。

投稿2023/03/21 05:41

YellowGreen

総合スコア868

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問