アセット_91

Google Driveを使ってもらっていた士業と契約が終わったあとにやるべき、些細だが大きなこと

0. 3行でまとめると

・組織外の人がオーナーのファイルは、将来アクセス不可になる可能性ある
・その人が関与終わったら、事故る前に全部アクセス権は変更しておくべき
・その処理のためのGoogle Apps Script例つけておきました

1. どのような話か

会社で契約している士業の人が、「ベンチャーに強い」「ITに強い」とされる場合、Google Drive上で直接資料のやり取りを行うケースが多いだろう。

この場合、Google Drive上に入ってもらうアカウントは何を使っているだろうか。会社ドメインのアカウントを1つ発行せず、士業の人のドメインのアカウントを使っている場合、ある問題に直面する可能性がある。

その士業の人との契約が終わったあと、その人(やその事務所のスタッフ)が作成したファイルは、いつアクセスできなくなってもおかしくない、ということだ。

(1)アクセス権変更されたらアウト
Google Driveは、原則として自社ドメイン内でファイルを共有することが原則で、他社ドメインにファイルを共有することは例外的な使い方となる。

そのため、関与が終わったクライアント(=つまり自分たち)のファイルを、保管用の(通常は外部共有できない)設定に変更されると、そのファイルにアクセスできなくなる。

また、Google Driveに使い慣れていない組織だと、当初は、自社ドメインのファイルを他社に自由に共有を行い ②ある程度使用量が増えたあとに、組織外に簡単に共有できなくなるように再設定を行う、場合がある。
このように全社的に設定を見直した時、関与が終わったクライアントの共有設定を正しく(=つまり他社ドメインに共有したまま)にしてくれるだろうか。

(2)削除されたらアウト
当然ながら担当者が、自分のGoogle Drive内で、ファイルの削除コマンドを押した場合ファイルは完全に削除される。ただ、元クライアントのファイルを、率先してその人が削除する確率はそれほど高くないかもしれない(少なくとも事前確認ぐらいはしてくると期待している)。
最も悲惨なことは、その士業事務所で自社を担当していた人が退職した場合だ。

Google Driveの性質上、あるアカウントが削除されるとそれに紐づくファイルとフォルダは全て消える。
組織内の人が辞めた場合、そのアカウントが削除されないように、必要なファイル・フォルダのオーナー権を一括で、組織内(=同一ドメイン)の任意の誰かに移すコマンドが用意されている。対して、組織外(=別ドメイン)のアカウントにオーナー権を移譲する機能はない。

その士業の事務所が、本来Google Drive使っておらず、自社と仕事をするために例外的にDriveを使っていたとしたら?Driveのファイルの適切な引き継ぎはされず、そのアカウントの削除とともに、自社の大切な資料に二度とアクセスできなくなるだろう。
アカウントが削除されてそれに伴いファイルが削除された場合、20日経過するとそのファイルは一切復元できなくなる。


問題のまとめ
この通り、関与が完了した士業のアカウントで作成されたファイルを、そのままオーナー権を替えず放置しておくと、彼らの操作如何で大事な書類にアクセスできなくなる日は来る可能性がある。

当然、その関与が完了した士業のリテラシが高かったらこのような事故は起こらないだろう。
ただ、その士業は、関与終了時に、ファイルのオーナー権移譲の話はしてくれただろうか。また、最初にGoogle Driveを使うと話したときに、このリスクについて説明してくれただろうか。
そうでないなら、本人たちのITリテラシはそれほど高くなく、当然事故が生じる可能性は高い。

2. 解決方法:実際のGoogle Apps Script例

解決方法は非常にシンプルで、他社ドメインのフォルダ・ファイルについて、全て自社ドメインにオーナー権を移譲すれば良い。

ただし、Google Driveの仕様上、そのフォルダ・ファイルについて、他社ドメインにオーナー権を移すことができない。
そのため、「全て自社ドメインにオーナー権を移譲」するためには、①オーナー権が他社ドメインとなっているファイル・フォルダを見つけ、②それらを複製し、③元のファイル・フォルダを格納されていたフォルダから削除する操作が必要となる。

この手の処理はGoogle Apps Scriptが得意なので、Google Apps Scriptで解決する必要がある。
ある特定のフォルダについて、
・直下全てのフォルダを上から順番に探索し
・指定したメールアドレスのユーザーがオーナーのファイルを見つけ
・コピーして置き換える
処理について、Google Apps Scriptの記述例を一つ添付したので、本当に困ったら、Script Editorにコードを貼り付けて処理を行うとよいだろう。

/*
実行用関数
変数(フォルダとオーナー)を指定して、プログラミングを実行する。
*/
function myFunction() {
  const PARENTFOLDER = DriveApp.getFolderById('(ここにDriveのIDを入力する)'); //
  const OWNERADRESS = "ここにオーナーのメールADDRESSを入れる";
  folderChangeOwner(PARENTFOLDER,OWNERADRESS);
}

/*
処理部分
*/
function folderChangeOwner(folder,OwnerAdress){
  var folders = folder.getFolders();
  var files = folder.getFiles();
  var editors = folder.getEditors();
  
  if(folder.getOwner().getEmail() == OwnerAdress){
    //フォルダ生成してマイドライブ直下から削除
    var newfolder = DriveApp.createFolder(folder.getName());
    DriveApp.removeFolder(newfolder);
    Logger.log(folder.getName());

  //共有権限新しく生成したフォルダにコピー
    for (var i = 0; i < editors.length; i++) {
      newfolder.addEditor(editors[i]);
    }
    
  //傘下フォルダ全部移動して元のフォルダから削除
      while(folders.hasNext()){
        var childfolder = folders.next();
        newfolder.addFolder(childfolder);
        folder.removeFolder(childfolder);
      }  
  
  //傘下File全部移動して元のフォルダから削除       
      while(files.hasNext()){
        var childfile = files.next()
         newfolder.addFile(childfile);
         folder.removeFile(childfile);
      }
    
  //元のフォルダの名前を、"削除_"+元の名前に変更(検索時判別しやすいように)  
    folder.setName('削除_'+folder.getName())
   
   //親フォルダすべてに複製を作成。
    var parents = folder.getParents();
    while(parents.hasNext()){
      var parentFolder = parents.next();
      parentFolder.addFolder(newfolder);
      parentFolder.removeFolder(folder);
    }  
   
    folder = newfolder
    folders = folder.getFolders();
    files = folder.getFiles();
  }

  //指定したフォルダの、傘下のフォルダに対して同様の処理を実施する(再帰処理)
  while(folders.hasNext()){
      var childfolder = folders.next();
      folderChangeOwner(childfolder,OwnerAdress);
    }
  
  //指定したフォルダの、傘下のFileのオーナー権を移譲する
  while(files.hasNext()){
    var childfile = files.next();
    if(childfile.getOwner().getEmail() == OwnerAdress){
    childfile.makeCopy(childfile.getName(),folder);
    childfile.setName('削除_'+childfile.getName());
    folder.removeFile(childfile);
    }
  }
}

この処理自体は、Google Apps ScriptのReference自体を見ればすぐに書ける内容で、そこまで難しくない。
本件は、コードそれ自体を書く難易度より、他ドメインのファイルが自社ドメイン内に存在することの危険性を認識する難易度の方がはるかに高い。

何も処理をしないと、例えばその士業の人のアカウントが消えた場合、当然それに伴いファイルが消されアクセス不可能になる。それからしばらく立ったあと、必要なファイルが消えていることを認識して大惨事になるのだろう。

この記事が気に入ったらサポートをしてみませんか?