GoogleDriveのフォルダ共有について
お世話になります。
GoogleDriveについて質問させて頂きます。
GoogleDriveのフォルダを複数人に共有しているのですが、編集できる時間を指定して自動化したいです。
毎日7:00~19:00まで編集可能
毎日19:01~6:59まで編集不可(共有解除もしくは閲覧のみ)
GASやzapierで考えましたが、思い浮かばず、まずそもそも出来るモノなのか、ご教示頂きたいです。
フォルダでできない場合は、フォルダ内に入っているスプレッドシートに設定する方法でもありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
ここに時間指定のトリガーセットの方法について記載されていました。
トリガーセットについて
これを元に試してみました。
GAS
1function setTrigger(){ 2 // 前回までのトリガーすべて削除 3 const triggers = ScriptApp.getProjectTriggers(); 4 for(const trigger of triggers){ 5 if(trigger.getHandlerFunction() == "changeToEditor"){ 6 ScriptApp.deleteTrigger(trigger); 7 } 8 } 9 // トリガー追加(その日の6:50に実行) 10 const time = new Date(); 11 time.setHours(6); 12 time.setMinutes(50); 13 ScriptApp.newTrigger('changeToEditor').timeBased().at(time).create(); 14} 15 16function changeToEditor(){ 17 // 閲覧者を全て編集者へ 18 const folder = DriveApp.getFolderById("XXXXXX"); 19 var viewers = folder.getViewers(); 20 for (var i = 0; i < viewers.length; i++) { 21 folder.removeViewer(viewers[i].getEmail()); 22 folder.addEditor(viewers[i].getEmail()); 23 } 24} 25 26function changeToViewer(){ 27 const folder = DriveApp.getFolderById("XXXXXX"); 28 var editors = folder.getEditors(); 29 for (var i = 0; i < editors.length; i++) { 30 folder.removeEditor(editors[i].getEmail()); 31 folder.addViewer(editors[i].getEmail()); 32 } 33} 34 35
これは、閲覧者を編集者にするトリガーセットしか記載していません。
あとは、setTriggerを毎日時間主導型、日付ベースのタイマーの朝の時間でトリガーを
追加しておけばいけるんじゃないでしょうか。
※changeToViewerの内容が間違っていた(changeToEditorと同じになっていた)ので修正しました。
(追記)
フォルダ配下のフォルダやファイルの権限も処理する場合のコードは
以下で良いかと思います。
GAS
1function changeToEditor(){ 2 const folder = DriveApp.getFolderById("XXXXX"); 3 changeToEditorSub(folder); 4} 5 6function changeToEditorSub(folder){ 7 var viewers = folder.getViewers(); 8 for (var i = 0; i < viewers.length; i++) { 9 folder.removeViewer(viewers[i].getEmail()); 10 folder.addEditor(viewers[i].getEmail()); 11 } 12 var files = folder.getFiles(); 13 while (files.hasNext()) { 14 var file = files.next(); 15 var viewers = file.getViewers(); 16 for (var i = 0; i < viewers.length; i++) { 17 file.removeViewer(viewers[i].getEmail()); 18 file.addEditor(viewers[i].getEmail()); 19 } 20 } 21 var subfolders = folder.getFolders(); 22 while (subfolders.hasNext()) { 23 var subfolder = subfolders.next(); 24 changeToEditorSub(subfolder); 25 } 26} 27 28 29function changeToViewer(){ 30 const folder = DriveApp.getFolderById("XXXXX"); 31 changeToViewerSub(folder); 32} 33 34function changeToViewerSub(folder){ 35 var editors = folder.getEditors(); 36 for (var i = 0; i < editors.length; i++) { 37 folder.removeEditor(editors[i].getEmail()); 38 folder.addViewer(editors[i].getEmail()); 39 } 40 var files = folder.getFiles(); 41 while (files.hasNext()) { 42 var file = files.next(); 43 var editors = file.getEditors(); 44 for (var i = 0; i < editors.length; i++) { 45 file.removeEditor(editors[i].getEmail()); 46 file.addViewer(editors[i].getEmail()); 47 } 48 } 49 var subfolders = folder.getFolders(); 50 while (subfolders.hasNext()) { 51 var subfolder = subfolders.next(); 52 changeToViewerSub(subfolder); 53 } 54}
(追記 2021/03/18)
上述の方法では必ず通知メールが飛ぶようです。
飛ばさないようにするにはDrive APIを使って実装する必要があるようです。
ネットで検索した結果を参考に権限の追加・変更・削除をテストしてみた結果を
以下に記します。
GAS
1function insertPermission(file_id,user_mail,role){ 2 var res=Drive.Permissions.insert( 3 { 4 'role': role, 5 'type': 'user', 6 'value': user_mail, 7 }, 8 file_id, 9 { 10 'sendNotificationEmails': 'false' 11 } 12 ); 13 return res.id; 14}
これで権限の追加が出来ます。
insertPermission([ファイルのID],[メールアドレス],{'writer'|'reader'|etc})
で呼び出せます。
で、戻り値で取得したresのidプロパティがpermissionidのようで
これを使って
GAS
1 var permission = Drive.Permissions.get(fileId=[file_id],permissionId=[permissionid]); 2 permission['role']={'writer'|'reader'|etc}; 3 Drive.Permissions.update(permission,[file_id],[permissionid]); 4 5 Drive.Permissions.remove([file_id],[permissionid]);
とすることで権限の変更・削除が確認出来ました。
後でpermissionidを取得する方法が分ればいいのですが、
今の所インサートしたタイミングで取得する方法しか私にはわかりません。
なのでスプレットシートで管理する等して、処理するのが良いのでしょうか。
処理でフォルダに権限を与えた場合、配下のフォルダ・ファイルも同時に権限を付与されるようです。
そしてそのフォルダの権限を変更・削除したら配下にも適用されると思われます。
ただし、別途手作業や別の処理で配下のフォルダ・ファイルに権限を与えた場合は
その権限は残るように見受けられます。
この為、フォルダ配下全ての権限をトリガーのタイミングで制御したい場合は
フォルダ配下のフォルダ・ファイル全ての権限を全て削除した後
権限付与を行う必要があるかと思います。
この削除は、DriveApp。権限付与はDrive APIですね。
そしてこの場合はpermissionidを保存しておく必要は無いですね
別途付与した者は残しておく。というのであれば上述のDrive APIによる権限変更で問題ないと思われます。
(追記 2021/03/19)
テストを兼ねて、Drive APIを使ったバージョンのフォルダ配下全ての権限をトリガーのタイミングで制御する処理を作ったので参考までに載せておきます。
注意点としては指定したフォルダに権限がないが配下のフォルダ・またはファイルには権限があるという人の権限は削除されることかな。
異常系は記載しておりませんのでそこの所はご容赦を。
GAS
1// 閲覧者を編集者に変更 2function changeToEditor(){ 3 const folder = DriveApp.getFolderById("XXXX"); 4 changeToEditorSub(folder); 5} 6 7// 閲覧者を編集者に変更 8function changeToViewer(){ 9 const folder = DriveApp.getFolderById("XXXX"); 10 changeToViewerSub(folder); 11} 12 13// 編集者と閲覧者を全て共有解除 14function deleteEditorAndViewer(){ 15 const folder = DriveApp.getFolderById("XXXX"); 16 deletePermission(folder,'all'); 17} 18 19// 編集者を追加 20function addEditors(){ 21 const folder = DriveApp.getFolderById("XXXX"); 22 var users = ['XXXX@XXXX.com'] 23 for (var i = 0; i < users.length; i++) { 24 insertPermission(folder.getId(),users[i],'writer') 25 } 26} 27 28// 閲覧者を追加 29function addViewers(){ 30 const folder = DriveApp.getFolderById("XXXX"); 31 var users = ['XXXX@XXXX.com'] 32 for (var i = 0; i < users.length; i++) { 33 insertPermission(folder.getId(),users[i],'reader') 34 } 35} 36 37// 配下を含め編集者に変更 38function changeToEditorSub(folder){ 39 var viewers = folder.getViewers(); 40 deletePermission(folder,'reader'); 41 for (var i = 0; i < viewers.length; i++) { 42 insertPermission(folder.getId(),viewers[i].getEmail(),'writer') 43 } 44} 45 46// 配下を含め閲覧者に変更 47function changeToViewerSub(folder){ 48 var editors = folder.getEditors(); 49 deletePermission(folder,'writer'); 50 for (var i = 0; i < editors.length; i++) { 51 insertPermission(folder.getId(),editors[i].getEmail(),'reader') 52 } 53} 54 55// 権限削除 56function deletePermission(folder,role){ 57 if (role=='all' || role == 'reader') { 58 var viewers = folder.getViewers(); 59 for (var i = 0; i < viewers.length; i++) { 60 folder.removeViewer(viewers[i].getEmail()); 61 } 62 } 63 if (role=='all' || role == 'writer') { 64 var editors = folder.getEditors(); 65 for (var i = 0; i < editors.length; i++) { 66 folder.removeEditor(editors[i].getEmail()); 67 } 68 } 69 var files = folder.getFiles(); 70 while (files.hasNext()) { 71 var file = files.next(); 72 if (role=='all' || role == 'reader') { 73 var viewers = file.getViewers(); 74 for (var i = 0; i < viewers.length; i++) { 75 file.removeViewer(viewers[i].getEmail()); 76 } 77 } 78 79 if (role=='all' || role == 'writer') { 80 var editors = file.getEditors(); 81 for (var i = 0; i < editors.length; i++) { 82 file.removeEditor(editors[i].getEmail()); 83 file.addViewer(editors[i].getEmail()); 84 } 85 } 86 } 87 var subfolders = folder.getFolders(); 88 while (subfolders.hasNext()) { 89 var subfolder = subfolders.next(); 90 deletePermission(subfolder,role); 91 } 92} 93 94function insertPermission(file_id,user_mail,role){ 95 var res=Drive.Permissions.insert( 96 { 97 'role': role, 98 'type': 'user', 99 'value': user_mail, 100 }, 101 file_id, 102 { 103 // ここをtrueに変えるか消せばメールが飛びます。 104 'sendNotificationEmails': 'false' 105 } 106 ); 107 return res.id; 108} 109
投稿2021/03/16 21:50
編集2021/03/18 22:11総合スコア1508
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/17 05:57 編集
2021/03/17 13:52 編集
2021/03/17 23:59
2021/03/18 02:28
2021/03/18 02:34 編集
2021/03/19 23:18 編集
2021/03/23 00:24
2021/03/23 00:27