LoginSignup
12
17

More than 3 years have passed since last update.

GASでGoogleDrive内のファイル・フォルダを一括で共有設定する

Posted at

■はじめに

ビジネスシーンにおいて、社内でファイルを共有したいときにファイル・フォルダの共有設定は大変重要になってきます。
案件関連、顧客情報、人事関連などなど…
しかし、大量のファイル・フォルダに対して手作業でそれらの共有設定を行うのは正直なかなかに骨が折れる作業です。

今回はGoogleDriveでファイルの作成と共有設定をするGASを開発する機会があったので、GoogleDriveにおいて大量のファイル・フォルダを一括で細かな共有設定ができるGASについて紹介します。

■今回紹介するツールイメージ

  1. ファイル名、アクセス権限者を1つのスプレッドシート(マスタ)に記載する
  2. GASで記載のスプレッドシートを元にテンプレファイルからファイル作成&権限付与をする

今回はマスタとなるシートから読み込んだユーザーのみに共有設定を行う例です。

■マスタとなるスプレッドシート(ファイル共有設定)

極めて単純なシートですが、
下のようなスプレッドシートを用意して、マスタとしてファイル名と編集権限者を設定したいように記載します。
下記スクリプトでは編集権限者を横に連続して書かなくても読み込むように作っています。

また、Gsuiteでグループを設定していればそのグループで記載してもまとめて共有設定が可能です。

※今回はGsuiteのアカウントでいうメールアドレスの頭(○○@××××××.×××でいうと○○)を編集権限者として記載

master.png

■スクリプト

function makeFilesSetShare() {
  var template = DriveApp.getFileById('<テンプレファイルのID>')
  var fileShareRange = SpreadsheetApp.openById('<ファイル共有設定のID>').getActiveSheet().getDataRange();

  //ファイル設定のデータを配列で取得
  var arr = fileShareRange.getValues();

  //配列の行数・列数を取得
  var row = fileShareRange.getLastRow();
  var column = fileShareRange.getLastColumn();

  var parentFolder = DriveApp.getFolderById('<親フォルダのID>'); //親フォルダ


  for (var i = 1; i < row; i++){
    var fileName = arr[i][0];
    var removeEditors = parentFolder.getEditors();

    var file = parentFolder.getFilesByName(fileName).next();

    //ファイル作成
    template.makeCopy(fileName, parentFolder);


    //権限設定
    //親フォルダの共有者の権限を外す
    for (var j=0; j < removeEditors .length ;j++) {
      file.removeEditor(removeEditors[j]);
    }

    //マスタのスプレッドシートで指定したメンバー・グループに権限付与
    var k = 1;
    while (k < column) {
      //空白のセルをスルーしないとエラーになるため
      if (arr[i][k] != '') {
        file.addEditor(arr[i][k]+'@××××××.×××');
      }
      k++;
    }
  }
}

■他にできることなど

通知をしないで共有設定

上記のスクリプトを動かして、共有設定するとすべてのファイルにおける権限付与者に通知がいきます。
大量のファイルに対して共有設定をする場合、スクリプトを実行した際に一斉に大量の通知がいく可能性があります。

通知がいく理由は、DriveAppクラスでaddEditorで権限付与しているためです。
通知がいかないようにするには、その他のクラス(SpreadsheetApp、DocumentAppなど)でaddEditorで権限付与します。

上で記述したスクリプトを以下のように書き換えます。(作成ファイルがスプレッドシートの場合)

/**
var file = parentFolder.getFilesByName(fileName).next();
上記の変数定義を下記に変更
*/
var id = parentFolder.getFilesByName(fileName).next().getId();  //DriveAppでIDを取得
var file = SpreadsheetApp.openById(id);                         //SpreadsheetAppに変換

フォルダに共有設定

基本的にはファイルの場合と変わりません。
上で記載したスクリプトで、共有設定するファイルvar file = parentFolder.getFilesByName(fileName).next();の定義をフォルダの定義に変えるだけになります。
例:var folder = DriveApp.getFolderById(<対象フォルダのID>);

ただし、
フォルダはDriveAppクラスでの共有設定になるため、どうしても通知がいくようになってしまいます。

通知なしで権限設定する場合は、Google Apps Scriptとは別のGoogle DriveのAPIで実現可能です。
こちらの記事を参考にしてください。
Google Apps - 通知メールを飛ばさずにGoogle Driveフォルダに権限追加する方法

おわりに

GASでここまで細かい権限設定までできるとは思ってませんでした。
社内の様々な業務の工数削減でGASは活躍する気がするので、もっと活用していきたいです。

12
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
17