久しぶりに 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 分制限が思いの外きつく、一度に複数の親フォルダ、複数の移譲先を指定するには無理があった感じです。
タイムアウト系の処理をもう少ししっかりできればなーと思う次第ですね。
上記スクリプトだと、数千ファイルは厳しくても、数百ファイルなら対応できると思います。(;´Д`)