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

回答編集履歴

12

余分と思われる処理を削除

2021/03/18 22:11

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -204,27 +204,19 @@
204
204
  }
205
205
  }
206
206
 
207
- // 配下を含め全権限を編集者に変更
207
+ // 配下を含め編集者に変更
208
208
  function changeToEditorSub(folder){
209
209
  var viewers = folder.getViewers();
210
- var editors = folder.getEditors();
211
210
  deletePermission(folder,'reader');
212
211
  for (var i = 0; i < viewers.length; i++) {
213
212
  insertPermission(folder.getId(),viewers[i].getEmail(),'writer')
214
213
  }
215
- for (var i = 0; i < editors.length; i++) {
216
- insertPermission(folder.getId(),editors[i].getEmail(),'writer')
217
- }
218
214
  }
219
215
 
220
- // 配下を含め全権限を閲覧者に変更
216
+ // 配下を含め閲覧者に変更
221
217
  function changeToViewerSub(folder){
222
- var viewers = folder.getViewers();
223
218
  var editors = folder.getEditors();
224
219
  deletePermission(folder,'writer');
225
- for (var i = 0; i < viewers.length; i++) {
226
- insertPermission(folder.getId(),viewers[i].getEmail(),'reader')
227
- }
228
220
  for (var i = 0; i < editors.length; i++) {
229
221
  insertPermission(folder.getId(),editors[i].getEmail(),'reader')
230
222
  }

11

誤記修正

2021/03/18 22:11

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -164,6 +164,7 @@
164
164
 
165
165
  (追記 2021/03/19)
166
166
  テストを兼ねて、Drive APIを使ったバージョンのフォルダ配下全ての権限をトリガーのタイミングで制御する処理を作ったので参考までに載せておきます。
167
+ 注意点としては指定したフォルダに権限がないが配下のフォルダ・またはファイルには権限があるという人の権限は削除されることかな。
167
168
  異常系は記載しておりませんのでそこの所はご容赦を。
168
169
 
169
170
  ```GAS
@@ -253,7 +254,7 @@
253
254
  }
254
255
  }
255
256
 
256
- if (role=='all' || role == 'reader') {
257
+ if (role=='all' || role == 'writer') {
257
258
  var editors = file.getEditors();
258
259
  for (var i = 0; i < editors.length; i++) {
259
260
  file.removeEditor(editors[i].getEmail());

10

メールを送らない版のコードを追記

2021/03/18 22:01

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -160,4 +160,128 @@
160
160
  権限付与を行う必要があるかと思います。
161
161
  この削除は、DriveApp。権限付与はDrive APIですね。
162
162
  そしてこの場合はpermissionidを保存しておく必要は無いですね
163
- 別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。
163
+ 別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。
164
+
165
+ (追記 2021/03/19)
166
+ テストを兼ねて、Drive APIを使ったバージョンのフォルダ配下全ての権限をトリガーのタイミングで制御する処理を作ったので参考までに載せておきます。
167
+ 異常系は記載しておりませんのでそこの所はご容赦を。
168
+
169
+ ```GAS
170
+ // 閲覧者を編集者に変更
171
+ function changeToEditor(){
172
+ const folder = DriveApp.getFolderById("XXXX");
173
+ changeToEditorSub(folder);
174
+ }
175
+
176
+ // 閲覧者を編集者に変更
177
+ function changeToViewer(){
178
+ const folder = DriveApp.getFolderById("XXXX");
179
+ changeToViewerSub(folder);
180
+ }
181
+
182
+ // 編集者と閲覧者を全て共有解除
183
+ function deleteEditorAndViewer(){
184
+ const folder = DriveApp.getFolderById("XXXX");
185
+ deletePermission(folder,'all');
186
+ }
187
+
188
+ // 編集者を追加
189
+ function addEditors(){
190
+ const folder = DriveApp.getFolderById("XXXX");
191
+ var users = ['XXXX@XXXX.com']
192
+ for (var i = 0; i < users.length; i++) {
193
+ insertPermission(folder.getId(),users[i],'writer')
194
+ }
195
+ }
196
+
197
+ // 閲覧者を追加
198
+ function addViewers(){
199
+ const folder = DriveApp.getFolderById("XXXX");
200
+ var users = ['XXXX@XXXX.com']
201
+ for (var i = 0; i < users.length; i++) {
202
+ insertPermission(folder.getId(),users[i],'reader')
203
+ }
204
+ }
205
+
206
+ // 配下を含め全権限を編集者に変更
207
+ function changeToEditorSub(folder){
208
+ var viewers = folder.getViewers();
209
+ var editors = folder.getEditors();
210
+ deletePermission(folder,'reader');
211
+ for (var i = 0; i < viewers.length; i++) {
212
+ insertPermission(folder.getId(),viewers[i].getEmail(),'writer')
213
+ }
214
+ for (var i = 0; i < editors.length; i++) {
215
+ insertPermission(folder.getId(),editors[i].getEmail(),'writer')
216
+ }
217
+ }
218
+
219
+ // 配下を含め全権限を閲覧者に変更
220
+ function changeToViewerSub(folder){
221
+ var viewers = folder.getViewers();
222
+ var editors = folder.getEditors();
223
+ deletePermission(folder,'writer');
224
+ for (var i = 0; i < viewers.length; i++) {
225
+ insertPermission(folder.getId(),viewers[i].getEmail(),'reader')
226
+ }
227
+ for (var i = 0; i < editors.length; i++) {
228
+ insertPermission(folder.getId(),editors[i].getEmail(),'reader')
229
+ }
230
+ }
231
+
232
+ // 権限削除
233
+ function deletePermission(folder,role){
234
+ if (role=='all' || role == 'reader') {
235
+ var viewers = folder.getViewers();
236
+ for (var i = 0; i < viewers.length; i++) {
237
+ folder.removeViewer(viewers[i].getEmail());
238
+ }
239
+ }
240
+ if (role=='all' || role == 'writer') {
241
+ var editors = folder.getEditors();
242
+ for (var i = 0; i < editors.length; i++) {
243
+ folder.removeEditor(editors[i].getEmail());
244
+ }
245
+ }
246
+ var files = folder.getFiles();
247
+ while (files.hasNext()) {
248
+ var file = files.next();
249
+ if (role=='all' || role == 'reader') {
250
+ var viewers = file.getViewers();
251
+ for (var i = 0; i < viewers.length; i++) {
252
+ file.removeViewer(viewers[i].getEmail());
253
+ }
254
+ }
255
+
256
+ if (role=='all' || role == 'reader') {
257
+ var editors = file.getEditors();
258
+ for (var i = 0; i < editors.length; i++) {
259
+ file.removeEditor(editors[i].getEmail());
260
+ file.addViewer(editors[i].getEmail());
261
+ }
262
+ }
263
+ }
264
+ var subfolders = folder.getFolders();
265
+ while (subfolders.hasNext()) {
266
+ var subfolder = subfolders.next();
267
+ deletePermission(subfolder,role);
268
+ }
269
+ }
270
+
271
+ function insertPermission(file_id,user_mail,role){
272
+ var res=Drive.Permissions.insert(
273
+ {
274
+ 'role': role,
275
+ 'type': 'user',
276
+ 'value': user_mail,
277
+ },
278
+ file_id,
279
+ {
280
+ // ここをtrueに変えるか消せばメールが飛びます。
281
+ 'sendNotificationEmails': 'false'
282
+ }
283
+ );
284
+ return res.id;
285
+ }
286
+
287
+ ```

9

追記

2021/03/18 21:54

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -159,4 +159,5 @@
159
159
  フォルダ配下のフォルダ・ファイル全ての権限を全て削除した後
160
160
  権限付与を行う必要があるかと思います。
161
161
  この削除は、DriveApp。権限付与はDrive APIですね。
162
+ そしてこの場合はpermissionidを保存しておく必要は無いですね
162
163
  別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。

8

誤記修正

2021/03/18 20:09

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -137,7 +137,7 @@
137
137
  これを使って
138
138
 
139
139
  ```GAS
140
- permission = Drive.Permissions.get(fileId=[file_id],permissionId=[permissionid]);
140
+ var permission = Drive.Permissions.get(fileId=[file_id],permissionId=[permissionid]);
141
141
  permission['role']={'writer'|'reader'|etc};
142
142
  Drive.Permissions.update(permission,[file_id],[permissionid]);
143
143
 

7

追記の補足

2021/03/18 14:48

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  ※changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。
48
48
 
49
- (補足)
49
+ (追記)
50
50
  フォルダ配下のフォルダやファイルの権限も処理する場合のコードは
51
51
  以下で良いかと思います。
52
52
 
@@ -148,4 +148,15 @@
148
148
  後でpermissionidを取得する方法が分ればいいのですが、
149
149
  今の所インサートしたタイミングで取得する方法しか私にはわかりません。
150
150
 
151
- なのでスプレットシートで管理する等して、処理するのが良いのでしょうか。
151
+ なのでスプレットシートで管理する等して、処理するのが良いのでしょうか。
152
+
153
+ 処理でフォルダに権限を与えた場合、配下のフォルダ・ファイルも同時に権限を付与されるようです。
154
+ そしてそのフォルダの権限を変更・削除したら配下にも適用されると思われます。
155
+ ただし、別途手作業や別の処理で配下のフォルダ・ファイルに権限を与えた場合は
156
+ その権限は残るように見受けられます。
157
+
158
+ この為、フォルダ配下全ての権限をトリガーのタイミングで制御したい場合は
159
+ フォルダ配下のフォルダ・ファイル全ての権限を全て削除した後
160
+ 権限付与を行う必要があるかと思います。
161
+ この削除は、DriveApp。権限付与はDrive APIですね。
162
+ 別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。

6

メール飛ばない方法を追記

2021/03/18 14:41

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -105,4 +105,47 @@
105
105
  changeToViewerSub(subfolder);
106
106
  }
107
107
  }
108
- ```
108
+ ```
109
+ (追記 2021/03/18)
110
+ 上述の方法では必ず通知メールが飛ぶようです。
111
+ 飛ばさないようにするにはDrive APIを使って実装する必要があるようです。
112
+ ネットで検索した結果を参考に権限の追加・変更・削除をテストしてみた結果を
113
+ 以下に記します。
114
+
115
+ [Drive APIを有効にする方法が記載されています](https://qiita.com/nurburg/items/7720d031a3adac5a3c34)
116
+
117
+ ```GAS
118
+ function insertPermission(file_id,user_mail,role){
119
+ var res=Drive.Permissions.insert(
120
+ {
121
+ 'role': role,
122
+ 'type': 'user',
123
+ 'value': user_mail,
124
+ },
125
+ file_id,
126
+ {
127
+ 'sendNotificationEmails': 'false'
128
+ }
129
+ );
130
+ return res.id;
131
+ }
132
+ ```
133
+ これで権限の追加が出来ます。
134
+ insertPermission([ファイルのID],[メールアドレス],{'writer'|'reader'|etc})
135
+ で呼び出せます。
136
+ で、戻り値で取得したresのidプロパティがpermissionidのようで
137
+ これを使って
138
+
139
+ ```GAS
140
+ permission = Drive.Permissions.get(fileId=[file_id],permissionId=[permissionid]);
141
+ permission['role']={'writer'|'reader'|etc};
142
+ Drive.Permissions.update(permission,[file_id],[permissionid]);
143
+
144
+ Drive.Permissions.remove([file_id],[permissionid]);
145
+ ```
146
+ とすることで権限の変更・削除が確認出来ました。
147
+
148
+ 後でpermissionidを取得する方法が分ればいいのですが、
149
+ 今の所インサートしたタイミングで取得する方法しか私にはわかりません。
150
+
151
+ なのでスプレットシートで管理する等して、処理するのが良いのでしょうか。

5

補足コードの修正

2021/03/18 14:26

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -57,6 +57,11 @@
57
57
  }
58
58
 
59
59
  function changeToEditorSub(folder){
60
+ var viewers = folder.getViewers();
61
+ for (var i = 0; i < viewers.length; i++) {
62
+ folder.removeViewer(viewers[i].getEmail());
63
+ folder.addEditor(viewers[i].getEmail());
64
+ }
60
65
  var files = folder.getFiles();
61
66
  while (files.hasNext()) {
62
67
  var file = files.next();
@@ -69,11 +74,6 @@
69
74
  var subfolders = folder.getFolders();
70
75
  while (subfolders.hasNext()) {
71
76
  var subfolder = subfolders.next();
72
- var viewers = subfolder.getViewers();
73
- for (var i = 0; i < viewers.length; i++) {
74
- subfolder.removeViewer(viewers[i].getEmail());
75
- subfolder.addEditor(viewers[i].getEmail());
76
- }
77
77
  changeToEditorSub(subfolder);
78
78
  }
79
79
  }
@@ -85,6 +85,11 @@
85
85
  }
86
86
 
87
87
  function changeToViewerSub(folder){
88
+ var editors = folder.getEditors();
89
+ for (var i = 0; i < editors.length; i++) {
90
+ folder.removeEditor(editors[i].getEmail());
91
+ folder.addViewer(editors[i].getEmail());
92
+ }
88
93
  var files = folder.getFiles();
89
94
  while (files.hasNext()) {
90
95
  var file = files.next();
@@ -97,11 +102,6 @@
97
102
  var subfolders = folder.getFolders();
98
103
  while (subfolders.hasNext()) {
99
104
  var subfolder = subfolders.next();
100
- var editors = subfolder.getEditors();
101
- for (var i = 0; i < editors.length; i++) {
102
- subfolder.removeEditor(editors[i].getEmail());
103
- subfolder.addViewer(editors[i].getEmail());
104
- }
105
105
  changeToViewerSub(subfolder);
106
106
  }
107
107
  }

4

配下の権限もすべて変更する関数例を追加

2021/03/17 19:54

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -44,4 +44,65 @@
44
44
  あとは、setTriggerを毎日時間主導型、日付ベースのタイマーの朝の時間でトリガーを
45
45
  追加しておけばいけるんじゃないでしょうか。
46
46
 
47
- ※changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。
47
+ ※changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。
48
+
49
+ (補足)
50
+ フォルダ配下のフォルダやファイルの権限も処理する場合のコードは
51
+ 以下で良いかと思います。
52
+
53
+ ```GAS
54
+ function changeToEditor(){
55
+ const folder = DriveApp.getFolderById("XXXXX");
56
+ changeToEditorSub(folder);
57
+ }
58
+
59
+ function changeToEditorSub(folder){
60
+ var files = folder.getFiles();
61
+ while (files.hasNext()) {
62
+ var file = files.next();
63
+ var viewers = file.getViewers();
64
+ for (var i = 0; i < viewers.length; i++) {
65
+ file.removeViewer(viewers[i].getEmail());
66
+ file.addEditor(viewers[i].getEmail());
67
+ }
68
+ }
69
+ var subfolders = folder.getFolders();
70
+ while (subfolders.hasNext()) {
71
+ var subfolder = subfolders.next();
72
+ var viewers = subfolder.getViewers();
73
+ for (var i = 0; i < viewers.length; i++) {
74
+ subfolder.removeViewer(viewers[i].getEmail());
75
+ subfolder.addEditor(viewers[i].getEmail());
76
+ }
77
+ changeToEditorSub(subfolder);
78
+ }
79
+ }
80
+
81
+
82
+ function changeToViewer(){
83
+ const folder = DriveApp.getFolderById("XXXXX");
84
+ changeToViewerSub(folder);
85
+ }
86
+
87
+ function changeToViewerSub(folder){
88
+ var files = folder.getFiles();
89
+ while (files.hasNext()) {
90
+ var file = files.next();
91
+ var editors = file.getEditors();
92
+ for (var i = 0; i < editors.length; i++) {
93
+ file.removeEditor(editors[i].getEmail());
94
+ file.addViewer(editors[i].getEmail());
95
+ }
96
+ }
97
+ var subfolders = folder.getFolders();
98
+ while (subfolders.hasNext()) {
99
+ var subfolder = subfolders.next();
100
+ var editors = subfolder.getEditors();
101
+ for (var i = 0; i < editors.length; i++) {
102
+ subfolder.removeEditor(editors[i].getEmail());
103
+ subfolder.addViewer(editors[i].getEmail());
104
+ }
105
+ changeToViewerSub(subfolder);
106
+ }
107
+ }
108
+ ```

3

IDが入ってた…

2021/03/17 13:48

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -29,7 +29,7 @@
29
29
  }
30
30
 
31
31
  function changeToViewer(){
32
- const folder = DriveApp.getFolderById("1v_IoMDGOIhJG28vq3PUVA1QFJ7U4bw3y");
32
+ const folder = DriveApp.getFolderById("XXXXXX");
33
33
  var editors = folder.getEditors();
34
34
  for (var i = 0; i < editors.length; i++) {
35
35
  folder.removeEditor(editors[i].getEmail());

2

ミス修正

2021/03/17 13:25

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  function changeToViewer(){
32
32
  const folder = DriveApp.getFolderById("1v_IoMDGOIhJG28vq3PUVA1QFJ7U4bw3y");
33
- var editors = folder.addEditor();
33
+ var editors = folder.getEditors();
34
34
  for (var i = 0; i < editors.length; i++) {
35
35
  folder.removeEditor(editors[i].getEmail());
36
36
  folder.addViewer(editors[i].getEmail());
@@ -44,4 +44,4 @@
44
44
  あとは、setTriggerを毎日時間主導型、日付ベースのタイマーの朝の時間でトリガーを
45
45
  追加しておけばいけるんじゃないでしょうか。
46
46
 
47
- changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。
47
+ changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。

1

changeToViewerの内容修正

2021/03/17 13:22

投稿

xail2222
xail2222

スコア1525

answer CHANGED
@@ -29,17 +29,19 @@
29
29
  }
30
30
 
31
31
  function changeToViewer(){
32
- // 編集者を全て閲覧者へ
33
- const folder = DriveApp.getFolderById("XXXXXX");
32
+ const folder = DriveApp.getFolderById("1v_IoMDGOIhJG28vq3PUVA1QFJ7U4bw3y");
34
- var viewers = folder.getViewers();
33
+ var editors = folder.addEditor();
35
- for (var i = 0; i < viewers.length; i++) {
34
+ for (var i = 0; i < editors.length; i++) {
36
- folder.removeViewer(viewers[i].getEmail());
35
+ folder.removeEditor(editors[i].getEmail());
37
- folder.addEditor(viewers[i].getEmail());
36
+ folder.addViewer(editors[i].getEmail());
38
37
  }
39
38
  }
40
39
 
40
+
41
41
  ```
42
42
  これは、閲覧者を編集者にするトリガーセットしか記載していません。
43
43
 
44
44
  あとは、setTriggerを毎日時間主導型、日付ベースのタイマーの朝の時間でトリガーを
45
- 追加しておけばいけるんじゃないでしょうか。
45
+ 追加しておけばいけるんじゃないでしょうか。
46
+
47
+ changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。