teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

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

2021/07/29 03:19

投稿

doco
doco

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,20 +1,13 @@
1
1
  ### 前提・実現したいこと
2
-
3
- ここに質問の内容を詳しく書いてください。
4
-
5
- GASを使用して共有ドライブのフォルダ名、メンバー、権限を取得しようとしております。
2
+ GASを使用して共有ドライブのフォルダ名(3階層)、メンバー、権限を取得しようとしております。
6
-
7
- 現在困っていることは以下3つです。
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
- Cannot read property 'role' of undefined
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, maxResults: 100, useDomainAdminAccess: true })
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 = 0; j < teamDrives.items.length; 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
- //supportsAllDrives:ドメイン管理者としてリクエストを発行。trueに設定するとファイルIDパラメータが共有ドライブを参照し、リクエスターが共有ライブが属するドメインの管理者である場合、リクエスターにアクセスが許可される。
68
+ //useDomainAdminAccess:ドメイン管理者としてリクエストを発行。trueに設定するとファイルID共有ドライブを参照し、リクエスターがドメインの管理者である場合、アクセスが許可される。
75
69
  do {
76
- permissions = Drive.Permissions.list(teamDrive.id, { maxResults: 100, pageToken: pageTokenPermissions, supportsAllDrives: true })
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
- //recordの番号からスタートする
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
- for (var n = record; n <= teamDrives.items.length; n++) {
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
- //権限(5通り)日本語に置換
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.role = "閲覧者)"
96
+ var permission = permissions.items[k];
96
- } else {
97
+ //配列オブジェクトvaluesに格納
98
+ values.push([teamDrive.name, "-", "-", permission.emailAddress, permission.role]);
97
99
  }
100
+ }
98
101
 
99
- var folders = DriveApp.getFolderById(teamDrive.id); //フォルダ
102
+ while (subFolders.hasNext()) { //フォルダがある場合
103
+ var subFolder = subFolders.next();
100
- var subFolders = folders.getFolders(); //フォルダ
104
+ var subSubFolders = subFolder.getFolders(); //フォルダ
101
105
 
102
- if (!subFolders.hasNext()) { //フォルダが無い場合
106
+ if (!subSubFolders.hasNext()) { //フォルダが無い場合
103
- for (var k = 0; k < permissions.items.length; k++) {
107
+ for (var l = 0; l < permissions.items.length; l++) {
104
- //メンバー情報を取得
105
- var permission = permissions.items[k];
108
+ var permission = permissions.items[l];
106
- //配列オブジェクトvaluesに格納
107
- values.push([teamDrive.name, "-", "-", permission.emailAddress, permission.role]);
109
+ values.push([teamDrive.name, subFolder.getName(), "-", permission.emailAddress, permission.role]);
108
110
  }
109
111
  }
110
-
111
- while (subFolders.hasNext()) { //フォルダがある場合
112
+ while (subSubFolders.hasNext()) { //フォルダがある場合
112
- var subFolder = subFolders.next();
113
+ var subSubFolder = subSubFolders.next();
113
- var subSubFolders = subFolder.getFolders(); //孫フォルダ
114
-
115
- if (!subSubFolders.hasNext()) { //孫フォルダが無い場合
116
- for (var l = 0; l < permissions.items.length; l++) {
114
+ for (var m = 0; m < permissions.items.length; m++) {
117
- var permission = permissions.items[l];
115
+ var permission = permissions.items[m];
118
- values.push([teamDrive.name, subFolder.getName(), "-", permission.emailAddress, permission.role]);
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
- var sheetLastRow = sheet.getLastRow() + 1; //シート内の最終行
122
+ var sheetLastRow = sheet.getLastRow() + 1; //シート内の最終行
132
- var lastRow = values.length;     //必要な行数
123
+ var lastRow = values.length;     //必要な行数
133
- var lastColumn = values[0].length;  //必要なカラム数
124
+ var lastColumn = values[0].length;  //必要なカラム数
134
125
 
135
- //時刻
126
+ //時刻
136
- var nowTime = new Date(); //現在
127
+ var nowTime = new Date(); //現在
137
- var timeDiff = parseInt((nowTime.getTime() - startTime.getTime()) / (1000 * 60)); //現在と開始時刻の差分
128
+ var timeDiff = parseInt((nowTime.getTime() - startTime.getTime()) / (1000 * 60)); //現在と開始時刻の差分
138
129
 
139
- //20分を超えた場合、トリガー追加で処理を停止
130
+ //20分を超えた場合、トリガー追加で処理を停止
140
- if (timeDiff >= 1) {
131
+ if (timeDiff >= 20) {
141
- //配列valuesを最終行に代入
132
+ //配列valuesを最終行に代入
142
- sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values);
133
+ sheet.getRange(sheetLastRow, 1, lastRow, lastColumn).setValues(values);
143
- //トリガーを設置、プロパティにrecordを登録しプログラムを停止
134
+ //トリガーを設置、プロパティにrecordを登録しプログラムを停止
144
- Properties.setProperty("record", record);
135
+ Properties.setProperty("record", record);
145
- setTrigger();
136
+ setTrigger();
146
- endFlag = false;
137
+ endFlag = false;
147
- console.log("トリガーを設置")
138
+ console.log("トリガーを設置")
148
- return;
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
- ①undefinedエラー
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
  参考としたサイト