久しぶりに GAS ( Google Apps Script ) の話題です。
ひょんなことから、Google Drive 内の数百以上のファイルのオーナー権限を
他者に変更する必要が出てきました。
自分がオーナー のファイルを一括で 特定の誰かひとり にオーナー権限を移譲することができるようですが、例えば「議事録フォルダ内のファイルを A さんに移譲」、
「ほげほげプロジェクトフォルダ内のファイルは B さんに移譲」みたいなことができません。
というわけで、そんな痒いところに手が届くスクリプトを書いちゃいました。
2. 移譲先が複数ある場合は都度スクリプトを実行する
| /** | |
| * 2017/12/09 | |
| * @author ryotsun | |
| * 【秘伝】ドライブ権限委譲ツール | |
| * 特定フォルダ以下にある自分がオーナーのフォルダとファイル | |
| * のオーナー権限を一括で変更するスクリプト | |
| * | |
| * Usage | |
| * 1. ドキュメント、スプレッドシートなどのスクリプトエディタにコードをペーストする | |
| * 2. 権限の委譲通知メールを送信しないようにするために Drive API を利用しているので、 | |
| 「リソース」→「 Google の拡張サービス」→「 Drive API 」を ON にする | |
| * 3. Google API Console の方でも「 Drive API 」を Enabled にする | |
| * 4. `base_folder_id`, `current_owner`, `new_owner` を設定する | |
| * 5. `myFunction()` を実行する | |
| * | |
| * スクリプトの処理時間が6分を超えるとタイムアウトします。( Apps Script の仕様) | |
| * タイムアウト対策はしていないので、対象ファイルが多くなりすぎないように注意して下さい… | |
| **/ | |
| function myFunction() { | |
| var base_folder_id = "XXXXXX"; // 検索対象とするフォルダのID | |
| var current_owner = "XXXXXX@gmail.com"; // 移譲元オーナー(自分)のメールアドレス | |
| var new_owner = "XXXXXX@gmail.com"; // 移譲先オーナーのメールアドレス | |
| var options = { | |
| "body": { | |
| "role": "owner", // 付与する権限 | |
| "type": "user", | |
| "value": new_owner // 付与対象者のメールアドレス | |
| }, | |
| "others": { | |
| "sendNotificationEmails": false // 通知メールを送信するかどうか | |
| } | |
| }; | |
| var parent_folder = DriveApp.getFolderById(base_folder_id); | |
| changeOwner(parent_folder, current_owner, options); | |
| } | |
| function changeOwner(folder, current_owner, options) { | |
| var folders = folder.getFolders(); | |
| // 自分がオーナーになっているファイルを取得する | |
| var files = folder.searchFiles("'me' in owners");; | |
| while (files.hasNext()) { | |
| var _file = files.next(); | |
| insertPermission(_file.getId(), options); | |
| Logger.log("ファイル名: " + _file.getName()); | |
| } | |
| while (folders.hasNext()) { | |
| var _folder = folders.next(); | |
| var _owner = _folder.getOwner(); | |
| if (_owner.getEmail() == current_owner) { | |
| insertPermission(_folder.getId(), options); | |
| Logger.log("フォルダ名: " + _folder.getName()); | |
| } | |
| // フォルダを再帰的に掘っていく | |
| changeOwner(_folder, current_owner, options); | |
| } | |
| } | |
| function insertPermission(id, options) { | |
| Drive.Permissions.insert(options.body, id, options.others); | |
| } |
スクリプト実行時間の 6 分制限が思いの外きつく、一度に複数の親フォルダ、複数の移譲先を指定するには無理があった感じです。
タイムアウト系の処理をもう少ししっかりできればなーと思う次第ですね。
上記スクリプトだと、数千ファイルは厳しくても、数百ファイルなら対応できると思います。(;´Д`)
mac に pip をインストールする
mac は標準で python が入っていますが、パッケージ管理の pip がインストールされていないので入れてみました。
2017/05/26 09:00
[Windows] Ophcrack を使ってユーザーパスワードを解析する方法
家族で使っていた Windows7 のログインパスワードを忘れたため、Ophcrack を使って解析したときの記録です。
2017/09/30 21:00
[GAS] Google Drive の特定フォルダ配下のフォルダ・ファイルの権限を一括で移譲する
Google Drive の特定フォルダ配下のファイル・フォルダの権限を一括で移譲するツールを Google Apps Script で作りました。
2017/12/09 13:38
さくらの VPS を踏み台にし、 SOCKS プロキシ経由でブラウジングする方法
さくらの VPS を踏み台にし、 SOCKS プロキシ経由でブラウジングできるように設定したときの記録
2018/01/07 10:40
OCN モバイル ONE であとから音声 SIM を追加して容量シェアする方法
先日、 OCN モバイル ONE の音声 SIM カードを追加し、容量シェアを行ったときのメモ。
2017/06/05 09:00