まいこーmemog

生きづらいとき人の言葉で生き返るので,自分も言葉にしてみる.[memo+blog]

GAS マスターファイルをコピーしてフォルダへポイ

f:id:maikocho:20180222180353j:plain

こんにちは。

 

GoogleAppScriptで以前こんな記事を書きました。

maikocho.hatenablog.com

 

内容としては

サークルの会計表作成面倒だからみんなに登録してもらうシステム作ったよ

みたいな感じです。

 

サークルは複数の部署のようなもの(班)で仕事分担しているため、今は班毎の表も作成してあります。

 

すると、年度更新の際、新しく作る必要のある表の数はおよそ15個。

しかも、登録フォームとの紐付けで表のIDも必要です。面倒すぎ。

 

ということで、コピー元となるマスターファイルさえ準備しておけばボタン一つでコピー作成が完了するツールを作ったのでメモ。

勉強しながら作ってるので汚いコードは勘弁願います。

 

 

マスターフォルダを作る

コピー元のファイルを束ねるフォルダを新規作成しておきます。

フォルダのIDはフォルダを開いたときのURLの末尾です。

 

~folders/ (フォルダのID)

 

ここに入れたファイルが自動コピーされるプログラムとします。

 

コピーされたファイルを入れるフォルダ作成部分

まず、GASの新規ファイルを作成して「コード.gs」に書いていきます。

フォルダを作成し、そのコードを返す関数の形で記述しています。

 

function CreateNewFolder(){

          var IdNewFolder = DriveApp.createFolder("フォルダ名").getId();
          return IdNewFolder;

}

 

DriveAppはドライブ内でファイルやフォルダを操作します!みたいな宣言と考えれば良いと思います。

 

createFolder()はその通り、フォルダをクリエイトします!って感じで。

 

getId()はその作ったフォルダに対してIDの値くれよ!とお願いしています。

 

そしてIDを「IdNewFolder」という名前の変数に入れたので、その値を戻して(出力して)欲しい僕はreturnの後に変数名を書きました。

 

これでCreateNewFolder()という関数を実行したら新しくフォルダを作ってIDを持ってきてくれます。

 

マスターフォルダ内のファイルをコピーする部分

ファイルコピー

 function AutoCopy() {
     // マスターのフォイルを一括で取得
          var files = DriveApp.getFolderById("マスターフォルダID").getFiles();
     // 新しいフォルダを作成
          var newfolder = DriveApp.getFolderById(CreateNewFolder());
     //新しいファイルのIDをリスト化する用意
          var Newfiles = {};
          var NewfilesName = {};
          var i = 0;


     // 一括取得したファイルをバラす
          while(files.hasNext()){
          //マスターファイル取得
               var file = files.next();
          //マスターファイルのファイル名取得
               var name = file.getName();
          //マスターファイルを新しいフォルダにコピー,IDをリストに追加
               var meta = file.makeCopy(name,newfolder);
               Newfiles[ i ] = meta.getId();
               NewfilesName[ i ] = meta.getName();
               i++;
          }

 

ファイルをコピーする部分は以上です。

初めにfilesという変数にイテレータ形式でマスターフォルダ内のファイルを一括で代入します。

 

イテレータはファイルを並べてひとまとめにしたものというイメージで良いかと思います。

 

while文の中身でそのイテレータを1つずつバラして新しく作ったフォルダにコピーしてます。

makeCopy()はファイルオブジェクトをコピーする操作です。

第一引数にコピーされたファイル名、第二引数にコピーを保存する場所を指定します。

 

ここでは後に書く、コピーしたファイルのID一覧ファイルを作成する機能実現のためにコピーファイルをmetaという変数に入れてます。

 

IDと名前のリストをそれぞれNewfilesNewfilesNameとしています。

 

コピーされたファイルの名前とID一覧作成

先ほどのAutoCopy()関数内の続きでこれを書いています。


         var Mdatafile = DriveApp.getFileById("一覧のひな型ファイルのID");
         var datafileid = Mdatafile.makeCopy("ファイル名",newfolder).getId();
         var datafile = SpreadsheetApp.openById(datafileid);
         var ss = datafile.getSheetByName("シート1");
         var i = 0;
         while(Newfiles[ i ]){
              var range = ss.getRange( i+2, 1);
              range.setValue(NewfilesName[ i ]);
              var range = ss.getRange( i+2, 2);
              range.setValue(Newfiles[ i ]);
              i++;
         }
}

 

今回コピーしたファイルの名称とIDを一覧にするファイルのひな型として簡単にファイルを作っておきました。

f:id:maikocho:20180222111046p:plain

 

最初のIDはこれのIDです。

2行目は先ほどと同様にコピーして、IDを取得しています。

 

次の2行はコピーしたファイルを開いて、シートを取得しています。

 

while内はシート内で値を設置したいセルを取得し、setValue()で名称とIDをそれぞれ設置しています。

 

まとめ

勉強しながらですがなんとか実現したかったことは達成できました。

AutoCopy()を実行すればマスターフォルダ内のファイルが何個であっても同様の処理ができる。

 

この機能は当たり前のようで自分で実装しようと思うとプログラミングの勉強をしないと触れない感覚が必要な感じがしました。

 

もうすぐミンパイが一通り終わるのでラズパイも初心者目線から進めていきたい所存。