【広告 No.01】

2015年12月3日木曜日

【GAS】共有設定されたフォルダ内のファイルに対して特定のユーザーを削除したい

【はじめに】

teratailにて質問した内容を改めてまとめたものです。

Aフォルダ(a,b,c,dと共有)内のBファイルに対してa,bのみの共有設定としたい。

  1. Aの共有設定はメールアドレスで設定されている
  2. メールアドレスはGoogleAppsアカウントではない
  3. ユーザーは全て編集者権限(Editor)

【実現したいこと】

var B = DriveApp.getFileById({__BファイルのID__});
B.removeEditor({__Email of c__});
B.removeEditor({__Email of d__});
上記にてBファイルは親フォルダ(A)の共有設定が引き継がれるので、要求を満たすためにはc,dを共有から外す必要がある。
手動での上記設定は可能であることは確認済みで、これをGASにて実行したい。



検証


上記はコードの極例ですが、実行後共有状態はa,b,c,dと共有のままで、c,dを外せません。
ドライブのディレクトリ構造として、A直下にBの他、C,D,E...とあり、Bのみ部分共有したいといった状況です。

1. 上記問題を確認するため、以下の様な簡単な検証を実施。

[検証用構成] Aフォルダ > Bファイル ※いずれも共有設定なし
[検証設定]
a. Aに対し編集者ユーザー(x、y、z)を追加(共有設定)
b. Aの編集者ユーザー(z)を削除
c. Aの編集者ユーザー(x、y)を削除(共有解除)
d. 一度共有設定を初期状態に戻し、Bに対し編集者ユーザー(x、y、z)を追加
e. Bの編集者ユーザー(z)を削除
f. Aの編集者ユーザー(x、y)を削除
※上から順番にa実行後にb、という流れで行いました。

[結果]
a. Bに共有設定継承
b. Bに共有設定継承
c. Bに共有設定継承(共有解除)
d. A(共有解除)、B(x、y、z)
e. A(共有解除)、B(x、y、z)
f. A(共有解除)、B(共有解除)

2. 上記よりGASによる共有設定処理、解除処理に問題がないことを確認。
その上で、GASの制限事項と考えられる問題について以下の設定にて追検証しました。

[検証用構成] Aフォルダ > Bファイル ※A(x、y)、B(x、y)
[追検証設定] 
g. Bに対し編集者ユーザー(z)を追加
h. Aの編集者ユーザー(x)を削除
i. Aに対し編集者ユーザー(x)を追加
j. Bの編集者ユーザー(y)を削除
k. Bの編集者ユーザー(z)を削除
※新たにAフォルダと同階層にCフォルダを作成(zと共有)。
l. BをDとしてCへコピー
m. BをCへ移動

[結果]
g. A(x、y)、B(x、y、z) 共有設定反映
h. A(y)、B(y、z) Aの設定がBに影響
i. A(x、y)、B(x、y、z) Aの設定がBに影響
j. A(x、y)、B(x、y、z) 処理が反映されない(エラーなし)
k. A(x、y)、B(x、y) 共有設定反映
l. A(x、y)、B(x、y)、C(z)、D(z)コピー先の親フォルダの設定を継承
m. A(x、y)、B(z)、C(z) コピー先の親フォルダの設定を継承

3. 1.及び2.の結果より、以下のことが現状の結論として導かれます。
  • 親フォルダの共有解除状態(Private)を含む、共有グループ外のユーザー追加は可能。
  • 親フォルダが共有設定されている場合、共有グループに含まれるユーザーを削除できない。
  • コピー及び移動(ムーブ)でも、元の共有設定は維持されない。
GASの公式リファレンスやWEB上での情報など、時間をかけて探してみましたがこれら共有設定に関する内容や制限事項として明記されている情報に当たることができませんでした。

現状、同様のことをGASにて実現したい場合には、親フォルダの共有設定を最低限にし、必要なユーザーを追加する、という方法ぐらいしか解決策がないようです。

以上「共有設定されたフォルダ内のファイルに対して特定のユーザーを削除したい」場合についての情報でした。

【参考サイト】