前提・実現したいこと
GASを使用して共有ドライブのフォルダ名(3階層)、メンバー、権限を取得しようとしております。
以下エラーメッセージが解消できずに困っております。
解決方法をご教示いただけると幸いです。
発生している問題・エラーメッセージ
GoogleJsonResponseException: API call to drive.permissions.list failed with error: The specified page token has expired, and can no longer be used. adminTeamDrives @ コード.gs:55
該当のソースコード
//権限一覧(3階層) function adminTeamDrives() { //既存のトリガーを削除しておく deleteTrigger(); //変数の宣言 var sheet = SpreadsheetApp.getActiveSheet(); //現在操作中のシートを取得 var teamDrives; //階層情報 var pageToken = ""; //階層情報 var permissions; //メンバー情報 var pageTokenPermissions = ""; //メンバー情報 const column = []; //配列の用意(列名) const values = []; //配列の用意(実データ) //トリガー用のフラグ変数と値の取得 var Properties = PropertiesService.getScriptProperties(); var record = parseInt(Properties.getProperty("record")); //スクリプトプロパティを取得 var endFlag = true; //recordの値を判定(値がない時は0とする) if (record >= 0) { //特になにもしない } else { record = 0; Properties.setProperty("record", 0); } //総開始時刻用の変数 var startTime = new Date(); //recordが0(=初回)の時のみ if (record == 0) { //開始時間を記録する Properties.setProperty("scriptstart", startTime); //列名をセルに代入 column.push(['階層1', '階層2', '階層3', 'メンバー', '権限']); sheet.getRange(1, 1, column.length, column[0].length).setValues(column); } //階層情報を取得 //useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとリクエスターが管理者であるドメインの全ての共有ドライブが返される。 do { teamDrives = Drive.Drives.list({ pageToken: pageToken, pageSize: 100, useDomainAdminAccess: true }) if (teamDrives.items && teamDrives.items.length > 0) { //階層1の情報を取得(record番目の親フォルダからスタートする) for (var j = record; j < teamDrives.items.length; j++) { var teamDrive = teamDrives.items[j]; //メンバー情報を取得 //supportsAllDrives:共有ドライブのアイテムをレスポンスに含ませるためtrueを設定。 //useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとファイルIDの共有ドライブを参照し、リクエスターがドメインの管理者である場合、アクセスが許可される。 do { permissions = Drive.Permissions.list(teamDrive.id, { pageSize: 100, pageToken: pageTokenPermissions, supportsAllDrives: true, useDomainAdminAccess: true}) if (permissions.items && permissions.items.length > 0) { for (var i = 0; i < teamDrives.items.length; i++) { var permission = permissions.items[i]; //権限(5通り)を日本語に置換 if (permission.role == "organizer") { permission.role = "管理者" } else if (permission.role == "fileOrganizer") { permission.role = "コンテンツ管理者" } else if (permission.role == "writer") { permission.role = "投稿者" } else if (permission.role == "commenter") { permission.role = "閲覧者(コメント可)" } else if (permission.role == "reade") { permission.role = "閲覧者)" } else { } var folders = DriveApp.getFolderById(teamDrive.id); //親フォルダ var subFolders = folders.getFolders(); //子フォルダ if (!subFolders.hasNext()) { //子フォルダが無い場合 for (var k = 0; k < permissions.items.length; k++) { //メンバー情報を取得 var permission = permissions.items[k]; //配列オブジェクトvaluesに格納 values.push([teamDrive.name, "-", "-", permission.emailAddress, permission.role]); } } while (subFolders.hasNext()) { //子フォルダがある場合 var subFolder = subFolders.next(); var subSubFolders = subFolder.getFolders(); //孫フォルダ if (!subSubFolders.hasNext()) { //孫フォルダが無い場合 for (var l = 0; l < permissions.items.length; l++) { var permission = permissions.items[l]; values.push([teamDrive.name, subFolder.getName(), "-", permission.emailAddress, permission.role]); } } while (subSubFolders.hasNext()) { //孫フォルダがある場合 var subSubFolder = subSubFolders.next(); for (var m = 0; m < permissions.items.length; m++) { var permission = permissions.items[m]; values.push([teamDrive.name, subFolder.getName(), subSubFolder.getName(), permission.emailAddress, permission.role]); } } } //セル代入用の変数 var sheetLastRow = sheet.getLastRow() + 1; //シート内の最終行 var lastRow = values.length; //必要な行数 var lastColumn = values[0].length; //必要なカラム数 //時刻 var nowTime = new Date(); //現在 var timeDiff = parseInt((nowTime.getTime() - startTime.getTime()) / (1000 * 60)); //現在と開始時刻の差分 //20分を超えた場合、トリガー追加で処理を停止 if (timeDiff >= 20) { //配列valuesを最終行に代入 sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values); //トリガーを設置、プロパティにrecordを登録しプログラムを停止 Properties.setProperty("record", record); setTrigger(); endFlag = false; console.log("トリガーを設置") return; } } } pageTokenPermissions = permissions.nextPageToken //メンバー情報のpageTokenを取得する } while (pageTokenPermissions) console.log(j) if (endFlag == true) { //配列valuesを最終行に代入 sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values); //次の行番号を格納しておく record = Number(record) + 1; console.log("record2 = " + record) return; } } } pageToken = teamDrives.nextPageToken //階層情報のpageTokenを取得する } while (pageToken) } //トリガーを全削除する関数 function deleteTrigger() { var allTriggers = ScriptApp.getScriptTriggers(); for (var l = 0; l < allTriggers.length; l++) { ScriptApp.deleteTrigger(allTriggers[l]); } } //トリガーを設置する関数(testget関数を実行予定として登録) function setTrigger() { ScriptApp.newTrigger("adminTeamDrives") .timeBased() .everyMinutes(1) .create(); } //データを全クリアする function cleardata() { var ui = SpreadsheetApp.getUi(); sheet.clearContent(); SpreadsheetApp.flush(); ui.alert("データ消去しました。") }
補足情報(FW/ツールのバージョンなど)
参考としたサイト
https://qiita.com/ryosuk/items/8fdcd606d94e89e156ed
https://officeforest.org/wp/2018/11/24/google-apps-script%E3%81%A75%E5%88%86%E3%81%AE%E5%A3%81%EF%BC%88%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%EF%BC%89%E3%82%92%E7%AA%81%E7%A0%B4%E3%81%99%E3%82%8B/
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。