40 代おっさん GASのフォルダ・ファイルの共有と権限を操作する

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## フォルダ・ファイルの権限

Googleドライブのフォルダ・ファイルは、それぞれについて共有や権限の種類を設定できる。
Driveサービスにて、それらの操作を行うことができる。

DriveサービスはEnum Permissionとして整理されている。

Enum Permissionと権限の種類
|メンバー|名称|説明|
|-------|-----|---|
|OWNER|オーナー|すべての権限を持つ|
|EDIT|編集者|閲覧者（コメント可）の権限に加えて編集及び共有が可能|
|COMMENT|閲覧者（コメント可）|閲覧者の権限に加えてコメントが可能|
|VIEW|閲覧者|閲覧、コピーが可能|
|ORGANIZER|管理者|共有ドライブの管理をする権限を持つ|
|FILE_ORGANIZER|コンテンツ管理者|共有ドライブのコンテンツの管理をする権限を持つ|
|NONE|権限なし|権限がない状態|

＊フォルダ・ファイルの権限を操作する主なメンバーの図は、参考資料の本を見ていただくか、ネットで調べください。

### フォルダ・ファイルの権限を変更する

フォルダ・ファイルの権限を追加するには
addEditorメソッド：編集者
addCommenterメソッド：閲覧者（コメント可）
addViewerメソッド：閲覧者
を使う

構文

```javascript
Folderオブジェクト.addEditor(メールアドレス)
Folderオブジェクト.addViewe(メールアドレス)

Fileオブジェクト.addEditor(メールアドレス)
Fileオブジェクト.addCommenter(メールアドレス)
Fileオブジェクト.addViewe(メールアドレス)
```

フォルダには閲覧者（コメント可）は付与できない
メールアドレスは文字列でも指定できるが、DriveサービスのUserオブジェクトを指定することも可能

お試し

```javascript
function tosiki() {
  const email = '**************';

  const folderId = '*******************';
  const folder   = DriveApp.getFolderById(folderId);
  folder.addEditor(email);

  const fileId = '**********************';
  const file   = DriveApp.getFileById(fileId);
  file.addCommenter(email);
}
```

フォルダ・ファイルの権限を削除するには
removeEditorメソッド：編集者
removeCommenterメソッド：閲覧者（コメント可）
removeViewerメソッド：閲覧者
を使う

構文

```javascript
Folderオブジェクト.removeEditor(メールアドレス)
Folderオブジェクト.removeViewer(メールアドレス)

Fileオブジェクト.removeEditorメールアドレス)
Fileオブジェクト.removeCommenter(メールアドレス)
Fileオブジェクト.removeViewe(メールアドレス)
```

お試し

```javascript
function tosiki() {
  const email = 'k.toshiki1115@gmail.com';

  const folderId = '**********************';
  const folder   = DriveApp.getFolderById(folderId);
  folder.removeEditor(email);

  const fileId = '**********************';
  const file   = DriveApp.getFileById(fileId);
  file.removeCommenter(email);
}
```

### フォルダ・ファイルの共有範囲

５段階で設けられている共有範囲を用いて、まとめて権限を付与できる。
Enum Accessとして整理されている。

Enum Accessのメンバーと共有範囲
|メンバー|説明|
|-------|----|
|ANYONE|インターネット上の誰もが検索してアクセスできる|
|ANYONE_WITH_LINK|リングを知っている全員がアクセスできる|
|DOMAIN|ドメイン内の誰もが検索してアクセスできる|
|DOMAIN_WITH_LINK|リングを知っているドメイン内の全員がアクセスできる|
|PRIVATE|許可されたユーザーのみがアクセスできる|

フォルダ・ファイルの共有範囲を操作する主なメンバー
|メンバー|戻り値|説明|
|-------|------|----|
|getSharingAccess()|Access|共有範囲を取得する|
|getSharingPermission()|Permission|共有範囲の権限を取得する|
|setSharing(accessType, permissionType)|Folder/File|共有範囲とその権限を設定する|

お試し

```javascript
function tosiki() {
  const folderId = '**********************';
  const folder   = DriveApp.getFolderById(folderId);

  console.log(folder.getSharingAccess().toString());
  console.log(folder.getSharingPermission().toString);

  const fileId = '**********************';
  const file   = DriveApp.getFileById(folderId);

  console.log(file.getSharingAccess().toString());
  console.log(file.getSharingPermission().toString());
}
```

### フォルダ・ファイルの共有範囲を設定する

フォルダ・ファイルの共有範囲を設定するには
setSharingメソッド
を用いる

構文

```javascript
Folderオブジェクト.setSharing(共有範囲, 権限)
Fileオブジェクト.setSharing(共有範囲, 権限)
```

お試し

```javascript
function tosiki() {
  const folderId = '**********************';
  const folder   = DriveApp.getFolderById(folderId);
  folder.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);

  const fileId = '**********************';
  const file   = DriveApp.getFileById(folderId);
  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.COMMENT); 
}
```

## 参考資料

<https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Google-Apps-Script%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88/dp/4798064742>