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

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

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

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

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

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

4492閲覧

GASを使用して共有ドライブのフォルダ名取得

doco

総合スコア0

Google ドライブ

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

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

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2021/07/27 12:46

編集2021/07/29 03:19

前提・実現したいこと

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/

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しましたので、貼っておきます。
もっとキレイにできると思います。。。

function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('▶スクリプト実行') .addItem('権限一覧', 'adminTeamDrives') .addToUi(); } //権限一覧(3階層) function adminTeamDrives() { //既存のトリガーを削除しておく deleteTrigger(); //変数の宣言 var sheet = SpreadsheetApp.getActiveSheet(); //現在操作中のシートを取得 var startTime = new Date(); //開始時刻 var teamDrives; //階層情報 var pageToken; //階層情報 var permissions; //メンバー情報 var pageTokenPermissions; //メンバー情報 var column = []; //配列の用意(列名) var values = []; //配列の用意(実データ) //トリガー用のフラグ変数と値の取得 var Properties = PropertiesService.getScriptProperties(); var record = parseInt(Properties.getProperty("record")); //スクリプトプロパティを取得 var endFlag = false; //recordの値を判定(値がない時は0とする) if (record > 0) { //特になにもしない } else { record = 0; Properties.setProperty("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, maxResults: 100, useDomainAdminAccess: true }) if (teamDrives.items && teamDrives.items.length > 0) { //階層1の情報を取得(record番目の親フォルダからスタートする) for (var i = record; i < teamDrives.items.length; i++) { var teamDrive = teamDrives.items[i]; //メンバー情報を取得 //supportsAllDrives:共有ドライブのアイテムをレスポンスに含ませるためtrueを設定。 do { permissions = Drive.Permissions.list(teamDrive.id, { maxResults: 100, pageToken: pageTokenPermissions, supportsAllDrives: true }) if (permissions.items && permissions.items.length > 0) { 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]; //権限を日本語に置換 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 === "reader") { permission.role = "閲覧者" } //配列オブジェクト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]; 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 === "reader") { permission.role = "閲覧者" } 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]; 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 === "reader") { permission.role = "閲覧者" } 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) { //トリガーを設置、プロパティにrecordを登録しプログラムを停止 Properties.setProperty("record", record); setTrigger(); endFlag = false; return; } pageTokenPermissions = permissions.nextPageToken //メンバー情報のpageTokenを取得する console.log("i/teamDrives.items.length = " + i + "/" + teamDrives.items.length); } while (pageTokenPermissions) } } //配列valuesを最終行に代入 sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values); 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("データ消去しました。") }

投稿2021/08/04 04:23

doco

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問