[GAS] Google Drive の特定フォルダ配下のフォルダ・ファイルの権限を一括で移譲する
2017/12/09 13:38
  • 久しぶりに GAS ( Google Apps Script ) の話題です。

    ひょんなことから、Google Drive 内の数百以上のファイルのオーナー権限を
    他者に変更する必要が出てきました。

    自分がオーナー のファイルを一括で 特定の誰かひとり にオーナー権限を移譲することができるようですが、例えば「議事録フォルダ内のファイルを A さんに移譲」、
    「ほげほげプロジェクトフォルダ内のファイルは B さんに移譲」みたいなことができません。

    というわけで、そんな痒いところに手が届くスクリプトを書いちゃいました。

    仕様


    1. 指定したフォルダ配下に含まれる自分がオーナーのフォルダ/ファイルのオーナー権限を
    一括で指定したユーザーに移譲する

    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 分制限が思いの外きつく、一度に複数の親フォルダ、複数の移譲先を指定するには無理があった感じです。
    タイムアウト系の処理をもう少ししっかりできればなーと思う次第ですね。

    上記スクリプトだと、数千ファイルは厳しくても、数百ファイルなら対応できると思います。(;´Д`)


    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2017/12/09 13:38
  • ツール
  • Google Apps ScriptGASJava ScriptJSスクリプトGoogle Driveドライブ権限移譲
  • 新しい記事へ
    さくらの VPS を踏み台にし、 SOCKS プロキシ経由でブラウジングする方法

    古い記事へ
    Hulu View Modifier を更新しました

  • 関連する記事
    最新の広告商品を一緒に販売する営業社員を募集! (ログリー)
profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。