GASでGoogleドライブのファイルを
共有・権限設定する方法

ファイルを1つずつ手で共有するのは手間がかかり、設定ミスも起きがちです。GAS(Google Apps Script)のsetSharingaddEditorを使えば、共有と権限設定をコードで正確に自動化できます。

|対象: GAS / Googleドライブ / DriveApp

Table of Contents

共有と権限の基本(AccessとPermission)

GASでのドライブ共有は、DriveApp(ドライブを操作する組み込みサービス)で扱います。共有設定は「誰に見せるか(Access)」と「その人に何を許すか(Permission)」の2つの軸で決まります。

Access(公開範囲)

自分だけ・リンクを知っている人・組織全体・誰でも、のように「アクセスできる相手の範囲」を指定します。

Permission(権限)

閲覧のみ・コメント可・編集可、のように「その相手ができる操作」を指定します。

setSharing(範囲の切り替え)

リンク共有や組織公開など、公開範囲そのものをまとめて切り替えるときに使います。

addEditor など(個別招待)

メールアドレスを指定して、特定の人だけに権限を追加するときに使います。

ファイルのIDは、ドライブでファイルを開いたときのURL/d/●●●/edit●●●の部分です。以降のコードではこのIDをgetFileByIdに渡します。

リンクを知っている全員に共有する

最も使う場面が多いのが「リンクを知っている人なら誰でも閲覧できる」共有です。setSharingANYONE_WITH_LINKVIEWを渡すだけです。

// リンクを知っている全員に「閲覧のみ」を許可する
function shareByLink() {
  const file = DriveApp.getFileById("ここにファイルIDを入れる");

  // 第1引数: 誰に公開するか(Access)
  // 第2引数: 何ができるか(Permission)
  file.setSharing(
    DriveApp.Access.ANYONE_WITH_LINK,
    DriveApp.Permission.VIEW
  );

  // 共有用のURLを取得
  const url = file.getUrl();
  Logger.log("共有URL: " + url);
  return url;
}

編集も許可したい場合は第2引数をDriveApp.Permission.EDITに変えます。ただしリンクを知っていれば誰でも編集できてしまうため、編集共有は相手を限定するのが安全です(次章)。

AccessとPermissionの一覧

指定できる値は次のとおりです。用途に応じて組み合わせます。DOMAIN系は同じGoogle Workspace(会社などの組織アカウント)でのみ有効で、個人のGmailアカウントでは使えません。

// よく使う Access(公開範囲)
DriveApp.Access.PRIVATE            // 自分だけ(=非公開に戻す)
DriveApp.Access.ANYONE_WITH_LINK   // リンクを知っている全員
DriveApp.Access.ANYONE             // 誰でも(検索でも見つかる)
DriveApp.Access.DOMAIN_WITH_LINK   // 同じ組織でリンクを知っている人
DriveApp.Access.DOMAIN             // 同じ組織の全員

// よく使う Permission(できること)
DriveApp.Permission.VIEW           // 閲覧のみ
DriveApp.Permission.COMMENT        // コメント可
DriveApp.Permission.EDIT           // 編集可
DriveApp.Permission.NONE           // 権限なし(共有停止に使う)

特定の人をメールアドレスで招待する

社内メンバーなど「特定の相手だけ」に共有したいときは、addEditor(編集者)・addViewer(閲覧者)・addCommenter(コメント可)を使います。リンク共有と違い、招待された本人だけがアクセスできます。

// 特定の人をメールアドレスで招待する
function inviteMembers() {
  const file = DriveApp.getFileById("ここにファイルIDを入れる");

  // 編集者として追加(相手に共有通知メールが届く)
  file.addEditor("editor@example.com");

  // 閲覧者として追加
  file.addViewer("viewer@example.com");

  // コメントだけ許可
  file.addCommenter("reviewer@example.com");

  // 複数人をまとめて閲覧者に追加
  file.addViewers(["a@example.com", "b@example.com"]);
}

末尾にsが付くaddViewersaddEditorsは、メールアドレスの配列を渡してまとめて追加できます。

スプレッドシートから一括で共有する

共有先が多いときは、スプレッドシートに「メールアドレス」と「権限」を並べておき、それを読み込んで一括で招待すると管理が楽になります。無効なアドレスでエラーが出ても止まらないよう、try...catchで囲むのがポイントです。

// スプレッドシートの共有先リストから一括で共有する
// A列: メールアドレス / B列: 権限(editor / viewer / commenter)
function bulkShareFromSheet() {
  const fileId = "ここにファイルIDを入れる";
  const file = DriveApp.getFileById(fileId);

  const sheet = SpreadsheetApp.getActive().getSheetByName("共有先");
  const rows = sheet.getDataRange().getValues().slice(1); // ヘッダー除外

  rows.forEach((row) => {
    const email = String(row[0]).trim();
    const role = String(row[1]).trim().toLowerCase();
    if (!email) return;

    try {
      if (role === "editor") {
        file.addEditor(email);
      } else if (role === "commenter") {
        file.addCommenter(email);
      } else {
        file.addViewer(email); // 既定は閲覧者
      }
    } catch (e) {
      // 無効なアドレスや権限不足はスキップしてログに残す
      Logger.log(email + " の共有に失敗: " + e.message);
    }
  });
}

現在の共有状態を確認する

共有を変更する前に、いま誰と共有されているかを確認しておくと安全です。getSharingAccessで公開範囲、getEditorsgetViewersで個別に共有されている相手を取得できます。

// 現在の共有状態を確認する
function checkSharing() {
  const file = DriveApp.getFileById("ここにファイルIDを入れる");

  // 公開範囲と権限
  Logger.log("Access: " + file.getSharingAccess());
  Logger.log("Permission: " + file.getSharingPermission());

  // 個別に共有されている編集者・閲覧者のメール一覧
  const editors = file.getEditors().map((u) => u.getEmail());
  const viewers = file.getViewers().map((u) => u.getEmail());

  Logger.log("編集者: " + editors.join(", "));
  Logger.log("閲覧者: " + viewers.join(", "));
}

getEditorsが返すのはUserオブジェクトの配列です。メールアドレスはgetEmail()で取り出します。

共有を解除・権限を下げる

共有をやめるときは、個別に外す方法と、公開範囲ごと止める方法があります。特定の人だけ外すならremoveEditor、リンク共有そのものを止めるならPRIVATEに戻します。

// 共有を解除する
function revokeSharing() {
  const file = DriveApp.getFileById("ここにファイルIDを入れる");

  // 1. 個別に外す
  file.removeEditor("editor@example.com");
  file.removeViewer("viewer@example.com");

  // 2. リンク共有そのものを止めて「自分だけ」に戻す
  file.setSharing(
    DriveApp.Access.PRIVATE,
    DriveApp.Permission.NONE
  );
}

なお編集者を閲覧者に「格下げ」したい場合は、いったんremoveEditorで外してからaddViewerで追加し直します。

フォルダごと共有する

フォルダに共有を設定すると、その中のファイルやサブフォルダにも共有が引き継がれます(継承)。ファイルを1つずつ共有するより、共有用フォルダを1つ用意してそこに入れる運用が管理しやすくおすすめです。

// フォルダごと共有する(中のファイルにも継承される)
function shareFolder() {
  const folder = DriveApp.getFolderById("ここにフォルダIDを入れる");

  // チームメンバーを編集者として招待
  folder.addEditor("team@example.com");

  // ドメイン内でリンクを知っている人に閲覧を許可
  folder.setSharing(
    DriveApp.Access.DOMAIN_WITH_LINK,
    DriveApp.Permission.VIEW
  );
}

実務での注意点

1. ANYONE系のリンク共有は情報漏えいに直結する

ANYONE_WITH_LINKANYONEは、URLが第三者に転送されれば誰でも中身を見られます。個人情報や機密を含むファイルには使わず、社内共有はaddEditorやドメイン限定のDOMAIN_WITH_LINKを優先しましょう。

2. 実行にはドライブへのアクセス承認が必要

DriveAppを初めて使うスクリプトは、実行時に権限(スコープ)の承認を求められます。共有を変更するのはスクリプトを実行したアカウント自身なので、対象ファイルにそのアカウントが編集権限を持っている必要があります。

3. 大量共有はエラー処理と件数に注意

無効なメールアドレスや存在しないアカウントを渡すと例外が発生します。一括処理ではtry...catchで1件ずつ握りつぶし、失敗した相手をログに残しましょう。数百件を超える共有は実行時間制限にも注意が必要です。

4. Workspaceの管理者設定で共有が制限されることがある

組織のポリシーで「外部共有の禁止」が設定されていると、コードで外部アドレスを追加してもエラーになったり無視されたりします。想定どおり共有できないときは管理者設定も確認してください。

まとめ

GASでのドライブ共有は、公開範囲を切り替えるsetSharingと、特定の人を招待するaddEditor系の2つを押さえれば、ほとんどのケースに対応できます。スプレッドシートと組み合わせれば共有先の一括管理も自動化でき、手作業のミスや情報漏えいのリスクを減らせます。まずは閲覧のみのリンク共有から試し、機密ファイルには限定共有を徹底しましょう。

よくある質問

file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW) を実行します。第1引数のAccessが「誰に公開するか」、第2引数のPermissionが「何ができるか」です。閲覧のみならVIEW、編集を許すならEDITを指定します。設定後はfile.getUrl()で共有URLを取得できます。

メールアドレスを指定してaddEditor(編集者)、addViewer(閲覧者)、addCommenter(コメント可)を使います。setSharingと違い、招待された本人だけがアクセスでき、通常は共有通知メールも届きます。社内メンバーへの限定共有はこちらが安全です。

addEditorは「この人に権限を追加する」という個別招待で、対象は指定したメールアドレスの人だけです。setSharingは「リンクを知っている全員」「ドメイン全体」など公開範囲そのものを切り替える設定です。不特定多数に開くsetSharingは情報漏えいのリスクがあるため、限定共有はaddEditorを優先します。

個別に外すならremoveEditor(email)・removeViewer(email)を使います。リンク共有そのものを止めるなら file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.NONE) で自分だけがアクセスできる状態に戻せます。誰と共有中かはgetEditors()・getViewers()で確認できます。

はい。フォルダにaddEditorやsetSharingを設定すると、その中のファイルやサブフォルダにも共有が引き継がれます(継承)。ファイル単位で細かく分けたい場合はフォルダではなく個々のファイルに設定してください。なお継承した共有は、その親フォルダの権限を外すと解除されます。

同じ組織(Google Workspace)内であれば file.setOwner(email) で所有者を移せます。ただし個人のGmailアカウント間などドメインをまたぐ移管は制限があり、エラーになることがあります。所有権の移動は取り消しにくいので、実行前に対象ファイルを十分確認してください。

GAS開発・業務Webシステムを
相談する。

ドライブの共有自動化のほかにも、ファイル整理・帳票出力・Gmail自動化など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る