質問編集履歴
1
一部エラーが解消できましたので更新しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,20 +1,13 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
|
-
|
3
|
-
ここに質問の内容を詳しく書いてください。
|
4
|
-
|
5
|
-
GASを使用して共有ドライブのフォルダ名、メンバー、権限を取得しようとしております。
|
2
|
+
GASを使用して共有ドライブのフォルダ名(3階層)、メンバー、権限を取得しようとしております。
|
6
|
-
|
7
|
-
|
3
|
+
以下エラーメッセージが解消できずに困っております。
|
8
|
-
①undefinedエラー
|
9
|
-
②無限ループ
|
10
|
-
③30分でタイムアウト
|
11
|
-
|
12
4
|
解決方法をご教示いただけると幸いです。
|
13
5
|
|
14
6
|
### 発生している問題・エラーメッセージ
|
15
7
|
|
16
8
|
```
|
9
|
+
GoogleJsonResponseException: API call to drive.permissions.list failed with error: The specified page token has expired, and can no longer be used.
|
17
|
-
|
10
|
+
adminTeamDrives @ コード.gs:55
|
18
11
|
```
|
19
12
|
|
20
13
|
### 該当のソースコード
|
@@ -27,10 +20,10 @@
|
|
27
20
|
|
28
21
|
//変数の宣言
|
29
22
|
var sheet = SpreadsheetApp.getActiveSheet(); //現在操作中のシートを取得
|
30
|
-
var pageToken; //階層情報
|
31
|
-
var teamDrives;
|
23
|
+
var teamDrives; //階層情報
|
24
|
+
var pageToken = ""; //階層情報
|
32
|
-
var permissions;
|
25
|
+
var permissions; //メンバー情報
|
33
|
-
var pageTokenPermissions
|
26
|
+
var pageTokenPermissions = ""; //メンバー情報
|
34
27
|
const column = []; //配列の用意(列名)
|
35
28
|
const values = []; //配列の用意(実データ)
|
36
29
|
|
@@ -61,108 +54,106 @@
|
|
61
54
|
}
|
62
55
|
|
63
56
|
//階層情報を取得
|
64
|
-
//useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとリクエスターが管理者であるドメインの
|
57
|
+
//useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとリクエスターが管理者であるドメインの全ての共有ドライブが返される。
|
65
58
|
do {
|
66
|
-
teamDrives = Drive.Drives.list({ pageToken: pageToken,
|
59
|
+
teamDrives = Drive.Drives.list({ pageToken: pageToken, pageSize: 100, useDomainAdminAccess: true })
|
60
|
+
|
67
61
|
if (teamDrives.items && teamDrives.items.length > 0) {
|
68
|
-
//階層1の情報を取得
|
62
|
+
//階層1の情報を取得(record番目の親フォルダからスタートする)
|
69
|
-
for (var j =
|
63
|
+
for (var j = record; j < teamDrives.items.length; j++) {
|
70
64
|
var teamDrive = teamDrives.items[j];
|
71
|
-
console.log(j)
|
72
65
|
|
73
66
|
//メンバー情報を取得
|
67
|
+
//supportsAllDrives:共有ドライブのアイテムをレスポンスに含ませるためtrueを設定。
|
74
|
-
//
|
68
|
+
//useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとファイルIDの共有ドライブを参照し、リクエスターがドメインの管理者である場合、アクセスが許可される。
|
75
69
|
do {
|
76
|
-
permissions = Drive.Permissions.list(teamDrive.id, {
|
70
|
+
permissions = Drive.Permissions.list(teamDrive.id, { pageSize: 100, pageToken: pageTokenPermissions, supportsAllDrives: true, useDomainAdminAccess: true})
|
77
71
|
|
78
72
|
if (permissions.items && permissions.items.length > 0) {
|
79
73
|
for (var i = 0; i < teamDrives.items.length; i++) {
|
80
74
|
var permission = permissions.items[i];
|
81
75
|
|
82
|
-
//
|
76
|
+
//権限(5通り)を日本語に置換
|
77
|
+
if (permission.role == "organizer") {
|
78
|
+
permission.role = "管理者"
|
79
|
+
} else if (permission.role == "fileOrganizer") {
|
80
|
+
permission.role = "コンテンツ管理者"
|
81
|
+
} else if (permission.role == "writer") {
|
82
|
+
permission.role = "投稿者"
|
83
|
-
|
83
|
+
} else if (permission.role == "commenter") {
|
84
|
+
permission.role = "閲覧者(コメント可)"
|
85
|
+
} else if (permission.role == "reade") {
|
86
|
+
permission.role = "閲覧者)"
|
87
|
+
} else {
|
88
|
+
}
|
84
89
|
|
90
|
+
var folders = DriveApp.getFolderById(teamDrive.id); //親フォルダ
|
91
|
+
var subFolders = folders.getFolders(); //子フォルダ
|
92
|
+
|
93
|
+
if (!subFolders.hasNext()) { //子フォルダが無い場合
|
94
|
+
for (var k = 0; k < permissions.items.length; k++) {
|
85
|
-
|
95
|
+
//メンバー情報を取得
|
86
|
-
if (permission.role == "organizer") {
|
87
|
-
permission.role = "管理者"
|
88
|
-
} else if (permission.role == "fileOrganizer") {
|
89
|
-
permission.role = "コンテンツ管理者"
|
90
|
-
} else if (permission.role == "writer") {
|
91
|
-
permission.role = "投稿者"
|
92
|
-
} else if (permission.role == "commenter") {
|
93
|
-
permission.role = "閲覧者(コメント可)"
|
94
|
-
} else if (permission.role == "reade") {
|
95
|
-
permission
|
96
|
+
var permission = permissions.items[k];
|
96
|
-
|
97
|
+
//配列オブジェクトvaluesに格納
|
98
|
+
values.push([teamDrive.name, "-", "-", permission.emailAddress, permission.role]);
|
97
99
|
}
|
100
|
+
}
|
98
101
|
|
99
|
-
|
102
|
+
while (subFolders.hasNext()) { //子フォルダがある場合
|
103
|
+
var subFolder = subFolders.next();
|
100
|
-
var
|
104
|
+
var subSubFolders = subFolder.getFolders(); //孫フォルダ
|
101
105
|
|
102
|
-
if (!
|
106
|
+
if (!subSubFolders.hasNext()) { //孫フォルダが無い場合
|
103
|
-
for (var
|
107
|
+
for (var l = 0; l < permissions.items.length; l++) {
|
104
|
-
//メンバー情報を取得
|
105
|
-
var permission = permissions.items[
|
108
|
+
var permission = permissions.items[l];
|
106
|
-
//配列オブジェクトvaluesに格納
|
107
|
-
values.push([teamDrive.name,
|
109
|
+
values.push([teamDrive.name, subFolder.getName(), "-", permission.emailAddress, permission.role]);
|
108
110
|
}
|
109
111
|
}
|
110
|
-
|
111
|
-
while (
|
112
|
+
while (subSubFolders.hasNext()) { //孫フォルダがある場合
|
112
|
-
var
|
113
|
+
var subSubFolder = subSubFolders.next();
|
113
|
-
var subSubFolders = subFolder.getFolders(); //孫フォルダ
|
114
|
-
|
115
|
-
if (!subSubFolders.hasNext()) { //孫フォルダが無い場合
|
116
|
-
|
114
|
+
for (var m = 0; m < permissions.items.length; m++) {
|
117
|
-
|
115
|
+
var permission = permissions.items[m];
|
118
|
-
|
116
|
+
values.push([teamDrive.name, subFolder.getName(), subSubFolder.getName(), permission.emailAddress, permission.role]);
|
119
|
-
}
|
120
117
|
}
|
121
|
-
while (subSubFolders.hasNext()) { //孫フォルダがある場合
|
122
|
-
var subSubFolder = subSubFolders.next();
|
123
|
-
for (var m = 0; m < permissions.items.length; m++) {
|
124
|
-
var permission = permissions.items[m];
|
125
|
-
values.push([teamDrive.name, subFolder.getName(), subSubFolder.getName(), permission.emailAddress, permission.role]);
|
126
|
-
}
|
127
|
-
}
|
128
118
|
}
|
119
|
+
}
|
129
120
|
|
130
|
-
|
121
|
+
//セル代入用の変数
|
131
|
-
|
122
|
+
var sheetLastRow = sheet.getLastRow() + 1; //シート内の最終行
|
132
|
-
|
123
|
+
var lastRow = values.length; //必要な行数
|
133
|
-
|
124
|
+
var lastColumn = values[0].length; //必要なカラム数
|
134
125
|
|
135
|
-
|
126
|
+
//時刻
|
136
|
-
|
127
|
+
var nowTime = new Date(); //現在
|
137
|
-
|
128
|
+
var timeDiff = parseInt((nowTime.getTime() - startTime.getTime()) / (1000 * 60)); //現在と開始時刻の差分
|
138
129
|
|
139
|
-
|
130
|
+
//20分を超えた場合、トリガー追加で処理を停止
|
140
|
-
|
131
|
+
if (timeDiff >= 20) {
|
141
|
-
|
132
|
+
//配列valuesを最終行に代入
|
142
|
-
|
133
|
+
sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values);
|
143
|
-
|
134
|
+
//トリガーを設置、プロパティにrecordを登録しプログラムを停止
|
144
|
-
|
135
|
+
Properties.setProperty("record", record);
|
145
|
-
|
136
|
+
setTrigger();
|
146
|
-
|
137
|
+
endFlag = false;
|
147
|
-
|
138
|
+
console.log("トリガーを設置")
|
148
|
-
|
139
|
+
return;
|
149
|
-
}
|
150
140
|
}
|
151
141
|
}
|
152
142
|
}
|
153
143
|
pageTokenPermissions = permissions.nextPageToken //メンバー情報のpageTokenを取得する
|
154
144
|
} while (pageTokenPermissions)
|
145
|
+
|
155
|
-
|
146
|
+
console.log(j)
|
147
|
+
|
156
148
|
if (endFlag == true) {
|
157
|
-
|
158
149
|
//配列valuesを最終行に代入
|
159
150
|
sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values);
|
160
|
-
|
161
151
|
//次の行番号を格納しておく
|
162
152
|
record = Number(record) + 1;
|
163
153
|
console.log("record2 = " + record)
|
164
154
|
return;
|
165
155
|
}
|
156
|
+
|
166
157
|
}
|
167
158
|
}
|
168
159
|
pageToken = teamDrives.nextPageToken //階層情報のpageTokenを取得する
|
@@ -184,19 +175,18 @@
|
|
184
175
|
.everyMinutes(1)
|
185
176
|
.create();
|
186
177
|
}
|
187
|
-
```
|
188
178
|
|
189
|
-
|
179
|
+
//データを全クリアする
|
180
|
+
function cleardata() {
|
181
|
+
var ui = SpreadsheetApp.getUi();
|
190
182
|
|
191
|
-
|
183
|
+
sheet.clearContent();
|
192
|
-
|
184
|
+
SpreadsheetApp.flush();
|
193
185
|
|
186
|
+
ui.alert("データ消去しました。")
|
187
|
+
}
|
194
|
-
|
188
|
+
```
|
195
|
-
→おそらく61行目の for (var n = record; n <= teamDrives.items.length; n++) { が原因箇所と思われるがどうすればいいか分からず。
|
196
189
|
|
197
|
-
③30分でタイムアウト
|
198
|
-
→おそらくトリガー?を設定できたので解決したかも。(①②のせいで動作確認できず)
|
199
|
-
|
200
190
|
### 補足情報(FW/ツールのバージョンなど)
|
201
191
|
|
202
192
|
参考としたサイト
|