Skip to content

Instantly share code, notes, and snippets.

@ryotsun
Last active December 5, 2019 07:22
Show Gist options
  • Save ryotsun/192e05a69dfe631d1543b0463d87f8b0 to your computer and use it in GitHub Desktop.
Save ryotsun/192e05a69dfe631d1543b0463d87f8b0 to your computer and use it in GitHub Desktop.
【秘伝】Google Drive 権限委譲ツール
/**
* 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 = "[email protected]"; // 移譲元オーナー(自分)のメールアドレス
var new_owner = "[email protected]"; // 移譲先オーナーのメールアドレス
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();
// Google のドキュメント以外はスキップ
if (mime.match(/google-apps/)) {
insertPermission(_file.getId(), options);
Logger.log("ファイル名: " + _file.getName());
} else {
Logger.log("スキップされました" + _file);
}
}
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);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment