回答編集履歴

12

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

2021/03/18 22:11

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -410,50 +410,34 @@
410
410
 
411
411
 
412
412
 
413
- // 配下を含め全権限を編集者に変更
413
+ // 配下を含め編集者に変更
414
414
 
415
415
  function changeToEditorSub(folder){
416
416
 
417
417
  var viewers = folder.getViewers();
418
418
 
419
+ deletePermission(folder,'reader');
420
+
421
+ for (var i = 0; i < viewers.length; i++) {
422
+
423
+ insertPermission(folder.getId(),viewers[i].getEmail(),'writer')
424
+
425
+ }
426
+
427
+ }
428
+
429
+
430
+
431
+ // 配下を含め閲覧者に変更
432
+
433
+ function changeToViewerSub(folder){
434
+
419
435
  var editors = folder.getEditors();
420
436
 
421
- deletePermission(folder,'reader');
437
+ deletePermission(folder,'writer');
422
-
423
- for (var i = 0; i < viewers.length; i++) {
424
-
425
- insertPermission(folder.getId(),viewers[i].getEmail(),'writer')
426
-
427
- }
428
438
 
429
439
  for (var i = 0; i < editors.length; i++) {
430
440
 
431
- insertPermission(folder.getId(),editors[i].getEmail(),'writer')
432
-
433
- }
434
-
435
- }
436
-
437
-
438
-
439
- // 配下を含め全権限を閲覧者に変更
440
-
441
- function changeToViewerSub(folder){
442
-
443
- var viewers = folder.getViewers();
444
-
445
- var editors = folder.getEditors();
446
-
447
- deletePermission(folder,'writer');
448
-
449
- for (var i = 0; i < viewers.length; i++) {
450
-
451
- insertPermission(folder.getId(),viewers[i].getEmail(),'reader')
452
-
453
- }
454
-
455
- for (var i = 0; i < editors.length; i++) {
456
-
457
441
  insertPermission(folder.getId(),editors[i].getEmail(),'reader')
458
442
 
459
443
  }

11

誤記修正

2021/03/18 22:11

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -330,6 +330,8 @@
330
330
 
331
331
  テストを兼ねて、Drive APIを使ったバージョンのフォルダ配下全ての権限をトリガーのタイミングで制御する処理を作ったので参考までに載せておきます。
332
332
 
333
+ 注意点としては指定したフォルダに権限がないが配下のフォルダ・またはファイルには権限があるという人の権限は削除されることかな。
334
+
333
335
  異常系は記載しておりませんのでそこの所はご容赦を。
334
336
 
335
337
 
@@ -508,7 +510,7 @@
508
510
 
509
511
 
510
512
 
511
- if (role=='all' || role == 'reader') {
513
+ if (role=='all' || role == 'writer') {
512
514
 
513
515
  var editors = file.getEditors();
514
516
 

10

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

2021/03/18 22:01

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -323,3 +323,251 @@
323
323
  そしてこの場合はpermissionidを保存しておく必要は無いですね
324
324
 
325
325
  別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。
326
+
327
+
328
+
329
+ (追記 2021/03/19)
330
+
331
+ テストを兼ねて、Drive APIを使ったバージョンのフォルダ配下全ての権限をトリガーのタイミングで制御する処理を作ったので参考までに載せておきます。
332
+
333
+ 異常系は記載しておりませんのでそこの所はご容赦を。
334
+
335
+
336
+
337
+ ```GAS
338
+
339
+ // 閲覧者を編集者に変更
340
+
341
+ function changeToEditor(){
342
+
343
+ const folder = DriveApp.getFolderById("XXXX");
344
+
345
+ changeToEditorSub(folder);
346
+
347
+ }
348
+
349
+
350
+
351
+ // 閲覧者を編集者に変更
352
+
353
+ function changeToViewer(){
354
+
355
+ const folder = DriveApp.getFolderById("XXXX");
356
+
357
+ changeToViewerSub(folder);
358
+
359
+ }
360
+
361
+
362
+
363
+ // 編集者と閲覧者を全て共有解除
364
+
365
+ function deleteEditorAndViewer(){
366
+
367
+ const folder = DriveApp.getFolderById("XXXX");
368
+
369
+ deletePermission(folder,'all');
370
+
371
+ }
372
+
373
+
374
+
375
+ // 編集者を追加
376
+
377
+ function addEditors(){
378
+
379
+ const folder = DriveApp.getFolderById("XXXX");
380
+
381
+ var users = ['XXXX@XXXX.com']
382
+
383
+ for (var i = 0; i < users.length; i++) {
384
+
385
+ insertPermission(folder.getId(),users[i],'writer')
386
+
387
+ }
388
+
389
+ }
390
+
391
+
392
+
393
+ // 閲覧者を追加
394
+
395
+ function addViewers(){
396
+
397
+ const folder = DriveApp.getFolderById("XXXX");
398
+
399
+ var users = ['XXXX@XXXX.com']
400
+
401
+ for (var i = 0; i < users.length; i++) {
402
+
403
+ insertPermission(folder.getId(),users[i],'reader')
404
+
405
+ }
406
+
407
+ }
408
+
409
+
410
+
411
+ // 配下を含め全権限を編集者に変更
412
+
413
+ function changeToEditorSub(folder){
414
+
415
+ var viewers = folder.getViewers();
416
+
417
+ var editors = folder.getEditors();
418
+
419
+ deletePermission(folder,'reader');
420
+
421
+ for (var i = 0; i < viewers.length; i++) {
422
+
423
+ insertPermission(folder.getId(),viewers[i].getEmail(),'writer')
424
+
425
+ }
426
+
427
+ for (var i = 0; i < editors.length; i++) {
428
+
429
+ insertPermission(folder.getId(),editors[i].getEmail(),'writer')
430
+
431
+ }
432
+
433
+ }
434
+
435
+
436
+
437
+ // 配下を含め全権限を閲覧者に変更
438
+
439
+ function changeToViewerSub(folder){
440
+
441
+ var viewers = folder.getViewers();
442
+
443
+ var editors = folder.getEditors();
444
+
445
+ deletePermission(folder,'writer');
446
+
447
+ for (var i = 0; i < viewers.length; i++) {
448
+
449
+ insertPermission(folder.getId(),viewers[i].getEmail(),'reader')
450
+
451
+ }
452
+
453
+ for (var i = 0; i < editors.length; i++) {
454
+
455
+ insertPermission(folder.getId(),editors[i].getEmail(),'reader')
456
+
457
+ }
458
+
459
+ }
460
+
461
+
462
+
463
+ // 権限削除
464
+
465
+ function deletePermission(folder,role){
466
+
467
+ if (role=='all' || role == 'reader') {
468
+
469
+ var viewers = folder.getViewers();
470
+
471
+ for (var i = 0; i < viewers.length; i++) {
472
+
473
+ folder.removeViewer(viewers[i].getEmail());
474
+
475
+ }
476
+
477
+ }
478
+
479
+ if (role=='all' || role == 'writer') {
480
+
481
+ var editors = folder.getEditors();
482
+
483
+ for (var i = 0; i < editors.length; i++) {
484
+
485
+ folder.removeEditor(editors[i].getEmail());
486
+
487
+ }
488
+
489
+ }
490
+
491
+ var files = folder.getFiles();
492
+
493
+ while (files.hasNext()) {
494
+
495
+ var file = files.next();
496
+
497
+ if (role=='all' || role == 'reader') {
498
+
499
+ var viewers = file.getViewers();
500
+
501
+ for (var i = 0; i < viewers.length; i++) {
502
+
503
+ file.removeViewer(viewers[i].getEmail());
504
+
505
+ }
506
+
507
+ }
508
+
509
+
510
+
511
+ if (role=='all' || role == 'reader') {
512
+
513
+ var editors = file.getEditors();
514
+
515
+ for (var i = 0; i < editors.length; i++) {
516
+
517
+ file.removeEditor(editors[i].getEmail());
518
+
519
+ file.addViewer(editors[i].getEmail());
520
+
521
+ }
522
+
523
+ }
524
+
525
+ }
526
+
527
+ var subfolders = folder.getFolders();
528
+
529
+ while (subfolders.hasNext()) {
530
+
531
+ var subfolder = subfolders.next();
532
+
533
+ deletePermission(subfolder,role);
534
+
535
+ }
536
+
537
+ }
538
+
539
+
540
+
541
+ function insertPermission(file_id,user_mail,role){
542
+
543
+ var res=Drive.Permissions.insert(
544
+
545
+ {
546
+
547
+ 'role': role,
548
+
549
+ 'type': 'user',
550
+
551
+ 'value': user_mail,
552
+
553
+ },
554
+
555
+ file_id,
556
+
557
+ {
558
+
559
+ // ここをtrueに変えるか消せばメールが飛びます。
560
+
561
+ 'sendNotificationEmails': 'false'
562
+
563
+ }
564
+
565
+ );
566
+
567
+ return res.id;
568
+
569
+ }
570
+
571
+
572
+
573
+ ```

9

追記

2021/03/18 21:54

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -320,4 +320,6 @@
320
320
 
321
321
  この削除は、DriveApp。権限付与はDrive APIですね。
322
322
 
323
+ そしてこの場合はpermissionidを保存しておく必要は無いですね
324
+
323
325
  別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。

8

誤記修正

2021/03/18 20:09

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -276,7 +276,7 @@
276
276
 
277
277
  ```GAS
278
278
 
279
- permission = Drive.Permissions.get(fileId=[file_id],permissionId=[permissionid]);
279
+ var permission = Drive.Permissions.get(fileId=[file_id],permissionId=[permissionid]);
280
280
 
281
281
  permission['role']={'writer'|'reader'|etc};
282
282
 

7

追記の補足

2021/03/18 14:48

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
 
96
96
 
97
- (補足)
97
+ (追記)
98
98
 
99
99
  フォルダ配下のフォルダやファイルの権限も処理する場合のコードは
100
100
 
@@ -299,3 +299,25 @@
299
299
 
300
300
 
301
301
  なのでスプレットシートで管理する等して、処理するのが良いのでしょうか。
302
+
303
+
304
+
305
+ 処理でフォルダに権限を与えた場合、配下のフォルダ・ファイルも同時に権限を付与されるようです。
306
+
307
+ そしてそのフォルダの権限を変更・削除したら配下にも適用されると思われます。
308
+
309
+ ただし、別途手作業や別の処理で配下のフォルダ・ファイルに権限を与えた場合は
310
+
311
+ その権限は残るように見受けられます。
312
+
313
+
314
+
315
+ この為、フォルダ配下全ての権限をトリガーのタイミングで制御したい場合は
316
+
317
+ フォルダ配下のフォルダ・ファイル全ての権限を全て削除した後
318
+
319
+ 権限付与を行う必要があるかと思います。
320
+
321
+ この削除は、DriveApp。権限付与はDrive APIですね。
322
+
323
+ 別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。

6

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

2021/03/18 14:41

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -213,3 +213,89 @@
213
213
  }
214
214
 
215
215
  ```
216
+
217
+ (追記 2021/03/18)
218
+
219
+ 上述の方法では必ず通知メールが飛ぶようです。
220
+
221
+ 飛ばさないようにするにはDrive APIを使って実装する必要があるようです。
222
+
223
+ ネットで検索した結果を参考に権限の追加・変更・削除をテストしてみた結果を
224
+
225
+ 以下に記します。
226
+
227
+
228
+
229
+ [Drive APIを有効にする方法が記載されています](https://qiita.com/nurburg/items/7720d031a3adac5a3c34)
230
+
231
+
232
+
233
+ ```GAS
234
+
235
+ function insertPermission(file_id,user_mail,role){
236
+
237
+ var res=Drive.Permissions.insert(
238
+
239
+ {
240
+
241
+ 'role': role,
242
+
243
+ 'type': 'user',
244
+
245
+ 'value': user_mail,
246
+
247
+ },
248
+
249
+ file_id,
250
+
251
+ {
252
+
253
+ 'sendNotificationEmails': 'false'
254
+
255
+ }
256
+
257
+ );
258
+
259
+ return res.id;
260
+
261
+ }
262
+
263
+ ```
264
+
265
+ これで権限の追加が出来ます。
266
+
267
+ insertPermission([ファイルのID],[メールアドレス],{'writer'|'reader'|etc})
268
+
269
+ で呼び出せます。
270
+
271
+ で、戻り値で取得したresのidプロパティがpermissionidのようで
272
+
273
+ これを使って
274
+
275
+
276
+
277
+ ```GAS
278
+
279
+ permission = Drive.Permissions.get(fileId=[file_id],permissionId=[permissionid]);
280
+
281
+ permission['role']={'writer'|'reader'|etc};
282
+
283
+ Drive.Permissions.update(permission,[file_id],[permissionid]);
284
+
285
+
286
+
287
+ Drive.Permissions.remove([file_id],[permissionid]);
288
+
289
+ ```
290
+
291
+ とすることで権限の変更・削除が確認出来ました。
292
+
293
+
294
+
295
+ 後でpermissionidを取得する方法が分ればいいのですが、
296
+
297
+ 今の所インサートしたタイミングで取得する方法しか私にはわかりません。
298
+
299
+
300
+
301
+ なのでスプレットシートで管理する等して、処理するのが良いのでしょうか。

5

補足コードの修正

2021/03/18 14:26

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -116,6 +116,16 @@
116
116
 
117
117
  function changeToEditorSub(folder){
118
118
 
119
+ var viewers = folder.getViewers();
120
+
121
+ for (var i = 0; i < viewers.length; i++) {
122
+
123
+ folder.removeViewer(viewers[i].getEmail());
124
+
125
+ folder.addEditor(viewers[i].getEmail());
126
+
127
+ }
128
+
119
129
  var files = folder.getFiles();
120
130
 
121
131
  while (files.hasNext()) {
@@ -140,54 +150,54 @@
140
150
 
141
151
  var subfolder = subfolders.next();
142
152
 
153
+ changeToEditorSub(subfolder);
154
+
155
+ }
156
+
157
+ }
158
+
159
+
160
+
161
+
162
+
163
+ function changeToViewer(){
164
+
165
+ const folder = DriveApp.getFolderById("XXXXX");
166
+
167
+ changeToViewerSub(folder);
168
+
169
+ }
170
+
171
+
172
+
173
+ function changeToViewerSub(folder){
174
+
143
- var viewers = subfolder.getViewers();
175
+ var editors = folder.getEditors();
144
-
176
+
145
- for (var i = 0; i < viewers.length; i++) {
177
+ for (var i = 0; i < editors.length; i++) {
146
-
178
+
147
- subfolder.removeViewer(viewers[i].getEmail());
179
+ folder.removeEditor(editors[i].getEmail());
148
-
180
+
149
- subfolder.addEditor(viewers[i].getEmail());
181
+ folder.addViewer(editors[i].getEmail());
182
+
183
+ }
184
+
185
+ var files = folder.getFiles();
186
+
187
+ while (files.hasNext()) {
188
+
189
+ var file = files.next();
190
+
191
+ var editors = file.getEditors();
192
+
193
+ for (var i = 0; i < editors.length; i++) {
194
+
195
+ file.removeEditor(editors[i].getEmail());
196
+
197
+ file.addViewer(editors[i].getEmail());
150
198
 
151
199
  }
152
200
 
153
- changeToEditorSub(subfolder);
154
-
155
- }
156
-
157
- }
158
-
159
-
160
-
161
-
162
-
163
- function changeToViewer(){
164
-
165
- const folder = DriveApp.getFolderById("XXXXX");
166
-
167
- changeToViewerSub(folder);
168
-
169
- }
170
-
171
-
172
-
173
- function changeToViewerSub(folder){
174
-
175
- var files = folder.getFiles();
176
-
177
- while (files.hasNext()) {
178
-
179
- var file = files.next();
180
-
181
- var editors = file.getEditors();
182
-
183
- for (var i = 0; i < editors.length; i++) {
184
-
185
- file.removeEditor(editors[i].getEmail());
186
-
187
- file.addViewer(editors[i].getEmail());
188
-
189
- }
190
-
191
201
  }
192
202
 
193
203
  var subfolders = folder.getFolders();
@@ -196,16 +206,6 @@
196
206
 
197
207
  var subfolder = subfolders.next();
198
208
 
199
- var editors = subfolder.getEditors();
200
-
201
- for (var i = 0; i < editors.length; i++) {
202
-
203
- subfolder.removeEditor(editors[i].getEmail());
204
-
205
- subfolder.addViewer(editors[i].getEmail());
206
-
207
- }
208
-
209
209
  changeToViewerSub(subfolder);
210
210
 
211
211
  }

4

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

2021/03/17 19:54

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -91,3 +91,125 @@
91
91
 
92
92
 
93
93
  ※changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。
94
+
95
+
96
+
97
+ (補足)
98
+
99
+ フォルダ配下のフォルダやファイルの権限も処理する場合のコードは
100
+
101
+ 以下で良いかと思います。
102
+
103
+
104
+
105
+ ```GAS
106
+
107
+ function changeToEditor(){
108
+
109
+ const folder = DriveApp.getFolderById("XXXXX");
110
+
111
+ changeToEditorSub(folder);
112
+
113
+ }
114
+
115
+
116
+
117
+ function changeToEditorSub(folder){
118
+
119
+ var files = folder.getFiles();
120
+
121
+ while (files.hasNext()) {
122
+
123
+ var file = files.next();
124
+
125
+ var viewers = file.getViewers();
126
+
127
+ for (var i = 0; i < viewers.length; i++) {
128
+
129
+ file.removeViewer(viewers[i].getEmail());
130
+
131
+ file.addEditor(viewers[i].getEmail());
132
+
133
+ }
134
+
135
+ }
136
+
137
+ var subfolders = folder.getFolders();
138
+
139
+ while (subfolders.hasNext()) {
140
+
141
+ var subfolder = subfolders.next();
142
+
143
+ var viewers = subfolder.getViewers();
144
+
145
+ for (var i = 0; i < viewers.length; i++) {
146
+
147
+ subfolder.removeViewer(viewers[i].getEmail());
148
+
149
+ subfolder.addEditor(viewers[i].getEmail());
150
+
151
+ }
152
+
153
+ changeToEditorSub(subfolder);
154
+
155
+ }
156
+
157
+ }
158
+
159
+
160
+
161
+
162
+
163
+ function changeToViewer(){
164
+
165
+ const folder = DriveApp.getFolderById("XXXXX");
166
+
167
+ changeToViewerSub(folder);
168
+
169
+ }
170
+
171
+
172
+
173
+ function changeToViewerSub(folder){
174
+
175
+ var files = folder.getFiles();
176
+
177
+ while (files.hasNext()) {
178
+
179
+ var file = files.next();
180
+
181
+ var editors = file.getEditors();
182
+
183
+ for (var i = 0; i < editors.length; i++) {
184
+
185
+ file.removeEditor(editors[i].getEmail());
186
+
187
+ file.addViewer(editors[i].getEmail());
188
+
189
+ }
190
+
191
+ }
192
+
193
+ var subfolders = folder.getFolders();
194
+
195
+ while (subfolders.hasNext()) {
196
+
197
+ var subfolder = subfolders.next();
198
+
199
+ var editors = subfolder.getEditors();
200
+
201
+ for (var i = 0; i < editors.length; i++) {
202
+
203
+ subfolder.removeEditor(editors[i].getEmail());
204
+
205
+ subfolder.addViewer(editors[i].getEmail());
206
+
207
+ }
208
+
209
+ changeToViewerSub(subfolder);
210
+
211
+ }
212
+
213
+ }
214
+
215
+ ```

3

IDが入ってた…

2021/03/17 13:48

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  function changeToViewer(){
62
62
 
63
- const folder = DriveApp.getFolderById("1v_IoMDGOIhJG28vq3PUVA1QFJ7U4bw3y");
63
+ const folder = DriveApp.getFolderById("XXXXXX");
64
64
 
65
65
  var editors = folder.getEditors();
66
66
 

2

ミス修正

2021/03/17 13:25

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -62,7 +62,7 @@
62
62
 
63
63
  const folder = DriveApp.getFolderById("1v_IoMDGOIhJG28vq3PUVA1QFJ7U4bw3y");
64
64
 
65
- var editors = folder.addEditor();
65
+ var editors = folder.getEditors();
66
66
 
67
67
  for (var i = 0; i < editors.length; i++) {
68
68
 
@@ -90,4 +90,4 @@
90
90
 
91
91
 
92
92
 
93
- changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。
93
+ changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。

1

changeToViewerの内容修正

2021/03/17 13:22

投稿

xail2222
xail2222

スコア1508

test CHANGED
@@ -60,21 +60,21 @@
60
60
 
61
61
  function changeToViewer(){
62
62
 
63
- // 編集者を全て閲覧者へ
63
+ const folder = DriveApp.getFolderById("1v_IoMDGOIhJG28vq3PUVA1QFJ7U4bw3y");
64
64
 
65
- const folder = DriveApp.getFolderById("XXXXXX");
65
+ var editors = folder.addEditor();
66
66
 
67
- var viewers = folder.getViewers();
67
+ for (var i = 0; i < editors.length; i++) {
68
68
 
69
- for (var i = 0; i < viewers.length; i++) {
69
+ folder.removeEditor(editors[i].getEmail());
70
70
 
71
- folder.removeViewer(viewers[i].getEmail());
72
-
73
- folder.addEditor(viewers[i].getEmail());
71
+ folder.addViewer(editors[i].getEmail());
74
72
 
75
73
  }
76
74
 
77
75
  }
76
+
77
+
78
78
 
79
79
 
80
80
 
@@ -87,3 +87,7 @@
87
87
  あとは、setTriggerを毎日時間主導型、日付ベースのタイマーの朝の時間でトリガーを
88
88
 
89
89
  追加しておけばいけるんじゃないでしょうか。
90
+
91
+
92
+
93
+ changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。