【Google Apps Script】createFileでファイル作成時にシートと同じ階層に作成する方法

f:id:annykyon:20180416173437p:plain

よく、Google スプレッドシートからスクリプトでjsonファイルなんかを書き出すのですが、ルートフォルダへの作成は簡単だけど、フォルダが散らかりがちだったりディレクトリ移動しないといけなかったりします。
フォルダIDを直接指定してもいいんだけど、メンバーで共有する場合はアクセスできないし、フォルダの共有はさらに散らかってわけわからなくなるのでしたくない。

ということで、スプレッドシートと同じ階層にファイルを作成できるようにしたけど、意外と大変だったのでメモしておきます。


手順としては

1.一旦ルートにファイルを作成
2.シートの親フォルダを取得
3.ルートに作成したファイルを削除、親フォルダにファイルを追加

という流れになります。


1.一旦ルートにファイルを作成

jsonDataには作成したデータを。
スプレッドシートからjsonデータを作成する手順はこのあたりを参考に

Google App Scriptを用いてGoogleスプレッドシートからJSONを生成してみよう | 東京上野のWeb制作会社LIG

 //一旦ルートにファイルを作成
 var file = DriveApp.createFile(  "outputFile.json" , JSON.stringify ( jsonData , null, 2 ) );

2.シートの親フォルダを取得する

これがちょっとめんどう
getFilesByNamecurrentFile.getParents などでファイルやフォルダ情報を取得すると、Iteratorというファイルのセットみたいなものを取得するのでwhileなどで一つ一つとりださないといけない。

//アクティブなシート(開いているスプレッドシート)情報の取得
var currentFileId = SpreadsheetApp.getActive().getId();//Id取得
var currentFileName = SpreadsheetApp.getActive().getName();//ファイル名取得

//アクティブなシートと同じ名前を持つドライブ内のすべてのファイルのコレクションを取得
var currentFiles = DriveApp.getFilesByName(currentFileName);
//アクティブなシートと同一IdのfileをcurretFileに代入
var currentFile;
while(currentFiles.hasNext()){
    currentFile = currentFiles.next();
    if(currentFile.getId() == currentFileId) break;
 }

 //親フォルダのコレクションを取得
 var parentFolders = currentFile.getParents();
//親フォルダがあればparentFolderに親フォルダを
 var parentFolder;
 while ( parentFolders.hasNext() ){
   parentFolder=parentFolders.next();
 }
//なければルートフォルダを指定
 if ( typeof(parentFolder)=="undefined" ) {
    parentFolder=DriveApp.getRootFolder();
 }

3.ルートに作成したファイルを削除、親フォルダにファイルを追加

後は、ルートのファイルを削除して、親フォルダに追加するだけです。

//ルートに作成したファイルを削除
rootFolder.removeFile(file);
//親フォルダにファイルを追加
parentFolder.addFile(file);

以上です。
もっと簡単な方法があるかもしれませんが。

全コード

//ファイルの作成
function outoputFile( jsonData ){
   //ルートにファイル作成
   var file = DriveApp.createFile(  "outputFile.json" , JSON.stringify ( jsonData , null, 2 ) );
   
   //アクティブなシート情報の取得
   var currentFileId = SpreadsheetApp.getActive().getId();//Id取得
   var currentFileName = SpreadsheetApp.getActive().getName();//ファイル名取得

   //アクティブなシートと同じ名前を持つドライブ内のすべてのファイルのコレクションを取得
   var currentFiles = DriveApp.getFilesByName(currentFileName);
   ///アクティブなシートと同一IdのfileをcurretFileに代入
   var currentFile;
   while(currentFiles.hasNext()){
      currentFile = currentFiles.next();
      if(currentFile.getId() == currentFileId) break;
   }
   //親フォルダのコレクションを取得
   var parentFolders = currentFile.getParents();
   //親フォルダがあればparentFolderに親フォルダを
   var parentFolder;
   while ( parentFolders.hasNext() ){
     parentFolder=parentFolders.next();
   }
   //なければルートフォルダを指定
   if ( typeof(parentFolder)=="undefined" ) {
     parentFolder=DriveApp.getRootFolder();
   }

   //ルートに作成したファイルを削除
   DriveApp.getRootFolder().removeFile(file);
   //親フォルダにファイルを追加
   parentFolder.addFile(file);

}