質問編集履歴

1

一部エラーが解消できましたので更新しました。

2021/07/29 03:19

投稿

doco
doco

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,24 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
-
4
-
5
- ここに質問の内容を詳しく書いてください。
6
-
7
-
8
-
9
- GASを使用して共有ドライブのフォルダ名、メンバー、権限を取得しようとしております。
3
+ GASを使用して共有ドライブのフォルダ名(3階層)、メンバー、権限を取得しようとしております。
10
-
11
-
12
-
4
+
13
- 現在困っていることは以下3つです。
5
+ 以下エラーメッセージが解消できずに困っております。
14
-
15
- ①undefinedエラー
16
-
17
- ②無限ループ
18
-
19
- ③30分でタイムアウト
20
-
21
-
22
6
 
23
7
  解決方法をご教示いただけると幸いです。
24
8
 
@@ -30,7 +14,9 @@
30
14
 
31
15
  ```
32
16
 
17
+ GoogleJsonResponseException: API call to drive.permissions.list failed with error: The specified page token has expired, and can no longer be used.
18
+
33
- Cannot read property 'role' of undefined
19
+ adminTeamDrives @ コード.gs:55
34
20
 
35
21
  ```
36
22
 
@@ -56,13 +42,13 @@
56
42
 
57
43
  var sheet = SpreadsheetApp.getActiveSheet(); //現在操作中のシートを取得
58
44
 
59
- var pageToken; //階層情報
60
-
61
- var teamDrives; //階層情報
45
+ var teamDrives; //階層情報
46
+
62
-
47
+ var pageToken = ""; //階層情報
48
+
63
- var permissions; //メンバー情報
49
+ var permissions; //メンバー情報
64
-
50
+
65
- var pageTokenPermissions; //メンバー情報
51
+ var pageTokenPermissions = ""; //メンバー情報
66
52
 
67
53
  const column = []; //配列の用意(列名)
68
54
 
@@ -124,200 +110,194 @@
124
110
 
125
111
  //階層情報を取得
126
112
 
127
- //useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとリクエスターが管理者であるドメインのすべての共有ドライブが返される。
113
+ //useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとリクエスターが管理者であるドメインのての共有ドライブが返される。
128
114
 
129
115
  do {
130
116
 
131
- teamDrives = Drive.Drives.list({ pageToken: pageToken, maxResults: 100, useDomainAdminAccess: true })
117
+ teamDrives = Drive.Drives.list({ pageToken: pageToken, pageSize: 100, useDomainAdminAccess: true })
118
+
119
+
132
120
 
133
121
  if (teamDrives.items && teamDrives.items.length > 0) {
134
122
 
135
- //階層1の情報を取得
123
+ //階層1の情報を取得(record番目の親フォルダからスタートする)
136
-
124
+
137
- for (var j = 0; j < teamDrives.items.length; j++) {
125
+ for (var j = record; j < teamDrives.items.length; j++) {
138
126
 
139
127
  var teamDrive = teamDrives.items[j];
140
128
 
129
+
130
+
131
+ //メンバー情報を取得
132
+
133
+ //supportsAllDrives:共有ドライブのアイテムをレスポンスに含ませるためtrueを設定。
134
+
135
+ //useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとファイルIDの共有ドライブを参照し、リクエスターがドメインの管理者である場合、アクセスが許可される。
136
+
137
+ do {
138
+
139
+ permissions = Drive.Permissions.list(teamDrive.id, { pageSize: 100, pageToken: pageTokenPermissions, supportsAllDrives: true, useDomainAdminAccess: true})
140
+
141
+
142
+
143
+ if (permissions.items && permissions.items.length > 0) {
144
+
145
+ for (var i = 0; i < teamDrives.items.length; i++) {
146
+
147
+ var permission = permissions.items[i];
148
+
149
+
150
+
151
+ //権限(5通り)を日本語に置換
152
+
153
+ if (permission.role == "organizer") {
154
+
155
+ permission.role = "管理者"
156
+
157
+ } else if (permission.role == "fileOrganizer") {
158
+
159
+ permission.role = "コンテンツ管理者"
160
+
161
+ } else if (permission.role == "writer") {
162
+
163
+ permission.role = "投稿者"
164
+
165
+ } else if (permission.role == "commenter") {
166
+
167
+ permission.role = "閲覧者(コメント可)"
168
+
169
+ } else if (permission.role == "reade") {
170
+
171
+ permission.role = "閲覧者)"
172
+
173
+ } else {
174
+
175
+ }
176
+
177
+
178
+
179
+ var folders = DriveApp.getFolderById(teamDrive.id); //親フォルダ
180
+
181
+ var subFolders = folders.getFolders(); //子フォルダ
182
+
183
+
184
+
185
+ if (!subFolders.hasNext()) { //子フォルダが無い場合
186
+
187
+ for (var k = 0; k < permissions.items.length; k++) {
188
+
189
+ //メンバー情報を取得
190
+
191
+ var permission = permissions.items[k];
192
+
193
+ //配列オブジェクトvaluesに格納
194
+
195
+ values.push([teamDrive.name, "-", "-", permission.emailAddress, permission.role]);
196
+
197
+ }
198
+
199
+ }
200
+
201
+
202
+
203
+ while (subFolders.hasNext()) { //子フォルダがある場合
204
+
205
+ var subFolder = subFolders.next();
206
+
207
+ var subSubFolders = subFolder.getFolders(); //孫フォルダ
208
+
209
+
210
+
211
+ if (!subSubFolders.hasNext()) { //孫フォルダが無い場合
212
+
213
+ for (var l = 0; l < permissions.items.length; l++) {
214
+
215
+ var permission = permissions.items[l];
216
+
217
+ values.push([teamDrive.name, subFolder.getName(), "-", permission.emailAddress, permission.role]);
218
+
219
+ }
220
+
221
+ }
222
+
223
+ while (subSubFolders.hasNext()) { //孫フォルダがある場合
224
+
225
+ var subSubFolder = subSubFolders.next();
226
+
227
+ for (var m = 0; m < permissions.items.length; m++) {
228
+
229
+ var permission = permissions.items[m];
230
+
231
+ values.push([teamDrive.name, subFolder.getName(), subSubFolder.getName(), permission.emailAddress, permission.role]);
232
+
233
+ }
234
+
235
+ }
236
+
237
+ }
238
+
239
+
240
+
241
+ //セル代入用の変数
242
+
243
+ var sheetLastRow = sheet.getLastRow() + 1; //シート内の最終行
244
+
245
+ var lastRow = values.length;     //必要な行数
246
+
247
+ var lastColumn = values[0].length;  //必要なカラム数
248
+
249
+
250
+
251
+ //時刻
252
+
253
+ var nowTime = new Date(); //現在
254
+
255
+ var timeDiff = parseInt((nowTime.getTime() - startTime.getTime()) / (1000 * 60)); //現在と開始時刻の差分
256
+
257
+
258
+
259
+ //20分を超えた場合、トリガー追加で処理を停止
260
+
261
+ if (timeDiff >= 20) {
262
+
263
+ //配列valuesを最終行に代入
264
+
265
+ sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values);
266
+
267
+ //トリガーを設置、プロパティにrecordを登録しプログラムを停止
268
+
269
+ Properties.setProperty("record", record);
270
+
271
+ setTrigger();
272
+
273
+ endFlag = false;
274
+
275
+ console.log("トリガーを設置")
276
+
277
+ return;
278
+
279
+ }
280
+
281
+ }
282
+
283
+ }
284
+
285
+ pageTokenPermissions = permissions.nextPageToken //メンバー情報のpageTokenを取得する
286
+
287
+ } while (pageTokenPermissions)
288
+
289
+
290
+
141
291
  console.log(j)
142
292
 
143
293
 
144
294
 
145
- //メンバー情報を取得
146
-
147
- //supportsAllDrives:ドメイン管理者としてリクエストを発行。trueに設定するとファイルIDパラメータが共有ドライブを参照し、リクエスターが共有ドライブが属するドメインの管理者である場合、リクエスターにアクセスが許可される。
148
-
149
- do {
150
-
151
- permissions = Drive.Permissions.list(teamDrive.id, { maxResults: 100, pageToken: pageTokenPermissions, supportsAllDrives: true })
152
-
153
-
154
-
155
- if (permissions.items && permissions.items.length > 0) {
156
-
157
- for (var i = 0; i < teamDrives.items.length; i++) {
158
-
159
- var permission = permissions.items[i];
160
-
161
-
162
-
163
- //recordの番号からスタートする
164
-
165
- for (var n = record; n <= teamDrives.items.length; n++) {
166
-
167
-
168
-
169
- //権限(5通り)を日本語に置換
170
-
171
- if (permission.role == "organizer") {
172
-
173
- permission.role = "管理者"
174
-
175
- } else if (permission.role == "fileOrganizer") {
176
-
177
- permission.role = "コンテンツ管理者"
178
-
179
- } else if (permission.role == "writer") {
180
-
181
- permission.role = "投稿者"
182
-
183
- } else if (permission.role == "commenter") {
184
-
185
- permission.role = "閲覧者(コメント可)"
186
-
187
- } else if (permission.role == "reade") {
188
-
189
- permission.role = "閲覧者)"
190
-
191
- } else {
192
-
193
- }
194
-
195
-
196
-
197
- var folders = DriveApp.getFolderById(teamDrive.id); //親フォルダ
198
-
199
- var subFolders = folders.getFolders(); //子フォルダ
200
-
201
-
202
-
203
- if (!subFolders.hasNext()) { //子フォルダが無い場合
204
-
205
- for (var k = 0; k < permissions.items.length; k++) {
206
-
207
- //メンバー情報を取得
208
-
209
- var permission = permissions.items[k];
210
-
211
- //配列オブジェクトvaluesに格納
212
-
213
- values.push([teamDrive.name, "-", "-", permission.emailAddress, permission.role]);
214
-
215
- }
216
-
217
- }
218
-
219
-
220
-
221
- while (subFolders.hasNext()) { //子フォルダがある場合
222
-
223
- var subFolder = subFolders.next();
224
-
225
- var subSubFolders = subFolder.getFolders(); //孫フォルダ
226
-
227
-
228
-
229
- if (!subSubFolders.hasNext()) { //孫フォルダが無い場合
230
-
231
- for (var l = 0; l < permissions.items.length; l++) {
232
-
233
- var permission = permissions.items[l];
234
-
235
- values.push([teamDrive.name, subFolder.getName(), "-", permission.emailAddress, permission.role]);
236
-
237
- }
238
-
239
- }
240
-
241
- while (subSubFolders.hasNext()) { //孫フォルダがある場合
242
-
243
- var subSubFolder = subSubFolders.next();
244
-
245
- for (var m = 0; m < permissions.items.length; m++) {
246
-
247
- var permission = permissions.items[m];
248
-
249
- values.push([teamDrive.name, subFolder.getName(), subSubFolder.getName(), permission.emailAddress, permission.role]);
250
-
251
- }
252
-
253
- }
254
-
255
- }
256
-
257
-
258
-
259
- //セル代入用の変数
260
-
261
- var sheetLastRow = sheet.getLastRow() + 1; //シート内の最終行
262
-
263
- var lastRow = values.length;     //必要な行数
264
-
265
- var lastColumn = values[0].length;  //必要なカラム数
266
-
267
-
268
-
269
- //時刻
270
-
271
- var nowTime = new Date(); //現在
272
-
273
- var timeDiff = parseInt((nowTime.getTime() - startTime.getTime()) / (1000 * 60)); //現在と開始時刻の差分
274
-
275
-
276
-
277
- //20分を超えた場合、トリガー追加で処理を停止
278
-
279
- if (timeDiff >= 1) {
280
-
281
- //配列valuesを最終行に代入
282
-
283
- sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values);
284
-
285
- //トリガーを設置、プロパティにrecordを登録しプログラムを停止
286
-
287
- Properties.setProperty("record", record);
288
-
289
- setTrigger();
290
-
291
- endFlag = false;
292
-
293
- console.log("トリガーを設置")
294
-
295
- return;
296
-
297
- }
298
-
299
- }
300
-
301
- }
302
-
303
- }
304
-
305
- pageTokenPermissions = permissions.nextPageToken //メンバー情報のpageTokenを取得する
306
-
307
- } while (pageTokenPermissions)
308
-
309
-
310
-
311
295
  if (endFlag == true) {
312
296
 
313
-
314
-
315
297
  //配列valuesを最終行に代入
316
298
 
317
299
  sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values);
318
300
 
319
-
320
-
321
301
  //次の行番号を格納しておく
322
302
 
323
303
  record = Number(record) + 1;
@@ -328,6 +308,8 @@
328
308
 
329
309
  }
330
310
 
311
+
312
+
331
313
  }
332
314
 
333
315
  }
@@ -370,32 +352,30 @@
370
352
 
371
353
  }
372
354
 
355
+
356
+
357
+ //データを全クリアする
358
+
359
+ function cleardata() {
360
+
361
+ var ui = SpreadsheetApp.getUi();
362
+
363
+
364
+
365
+ sheet.clearContent();
366
+
367
+ SpreadsheetApp.flush();
368
+
369
+
370
+
371
+ ui.alert("データ消去しました。")
372
+
373
+ }
374
+
373
375
  ```
374
376
 
375
377
 
376
378
 
377
- ### 試したこと
378
-
379
-
380
-
381
- ①undefinedエラー
382
-
383
-  →原因箇所が分からず。
384
-
385
-
386
-
387
- ②無限ループ
388
-
389
-  →おそらく61行目の for (var n = record; n <= teamDrives.items.length; n++) { が原因箇所と思われるがどうすればいいか分からず。
390
-
391
-
392
-
393
- ③30分でタイムアウト
394
-
395
-  →おそらくトリガー?を設定できたので解決したかも。(①②のせいで動作確認できず)
396
-
397
-
398
-
399
379
  ### 補足情報(FW/ツールのバージョンなど)
400
380
 
401
381