G-Drive上ファイルのコピー・移動など操作系のスクリプト関連まとめ
Google app script(GAS)のマクロを作ろうと思ったら、G-Driveにあるファイルの操作は欠かせないと思います。(たぶん)
というわけで、本記事では、G-Driveにあるファイルをコピーしたり、移動したりするGASスクリプトの基本操作について、ソースコードを交えて紹介したいと思います。
目次
ファイルのコピーにはmakecopyを使う
ファイルコピーで手っ取り早いのは、makecopyです。
G-Driveにあるファイルを指定したディレクトリにコピーすることができます。
ソースコードはこんな感じ。
//コピーするファイルの名前を作成
var copy_file_name = "*****"; // 自由な文字列で入力
//コピーするファイルを保存するディレクトリ作成
var copy_dir = DriveApp.getFolderById("************"); // コピ―したファイルを保存するフォルダIDを取得&入力
//コピーするデータのオブジェクトを取得
var moto_dat = DriveApp.getFileById("************"); // コピー元のファイルIDを取得&入力
//指定したディレクトリ(copy_dir)にファイルをコピー
var newfile = moto_dat.makeCopy(copy_file_name, copy_dir);
//コピーしたファイルをすぐに使いたい場合はIDを取得すると良い
var id_copy_file = newfile.getId();
事前に取得しておく必要があるのは、
・コピー元のファイルID
・コピー先のディレクトリID
の二点。
IDは、ブラウザのURL部分に表示される文字列なので、それをコピペしてくればOKです。
IDについて、詳しくは下記の記事にまとめています。
ファイルの移動にはaddFile・removeFileを使う
ある場所のファイルを別のディレクトリに移動させたい場合は、addFile・removeFileのメソッドを使いましょう。
ソースコードはこんな感じ。
//移動「前」のディレクトリ取得
var INPUT_dir = DriveApp.getFolderById("***************"); //ディレクトリのIDを入力
//移動「前」のファイル名
var INPUT_file_name = "*******************"; //移動させたいファイルの名前を入力
//移動「後」のディレクトリ取得
var OUTPUT_dir = DriveApp.getFolderById("*****************"); //ディレクトリのIDを入力
//ファイルオブジェクトの取得
var file = INPUT_dir.getFilesByName(INPUT_file_name).next();
//ファイルの移動
OUTPUT_dir.addFile(file);
INPUT_dir.removeFile(file);
上記では、移動前のディレクトリ、移動前のファイル名からファイルを移動させるようにしてますが、移動させたいファイルIDを直接指定してあげても、もちろんOKです。
操作したいファイルにアクセスする方法は色々とありますが、こちらの記事がわかりやすく、たいへん参考になりますので紹介します。
【参考】
▼Google Apps Scriptでファイル名、フォルダ名からファイルへアクセスしたい
https://qiita.com/tanaike/items/94c263d3906ee23ad522
また、ファイルオブジェクトでは、.nextをつけておくと、「未処理のファイル」を返してくれる意味があります。(逆に、.nextをつけないと操作できないので、一種のお約束と思って、つけておくようにしましょう。)
【重要】addFileだけ使うと・・・なんとショートカットコピーとなる
じつはaddFileだけ使ってファイルをコピーすると、コピー前のファイルとコピー後のファイルのIDは同じになります。つまり、ショートカットをコピーしたことになっており、これら二つのファイルは同じモノとなるのです。
・コピー前のファイル「A」
・コピー後のファイル「B」
⇒Bのファイルを編集した時、同じ内容の編集がAにも反映。(同期・共有した状態)
⇒G-drive上において、Bを削除するとAも削除されるので要注意。
そのため、以下のように覚えておくと良いです。
ショートカット(同期・共有)コピー:addFile
コピー:makecopy
移動:addFile + removefile
※addFileで同じファイルを複製して、removeFileで元のやつを削除。こうすることで移動と同義にさせています。(たぶんですが、GASでは、移動専用のメソッドっていうのは用意されていないみたいです。つまり、G-Driveでも移動をした際の内部処理はaddFileとremoveFileなのかもしれません。)
※G-Driveにて、あるファイルをctrl+shiftを押しながら別フォルダへドラッグアンドドロップすると、addFileの操作となります。(ショートカット作成)
ファイルを一括取得する方法もあり
先ほどの例では、ファイルを個別に取得して操作しましたが、特定ディレクトリにあるファイルをgetfilesでガバっと取得して、forやwhileなどの繰り返し関数で、順々にファイルの情報をゲットしていくという方法もあります。
//ファイルの保存されているフォルダを取得
var id_dir = DriveApp.getFolderById("**************"); // ディレクトリIDを入力
//フォルダ内のファイルを一括取得
var files = id_dir.getFiles();
//配列の準備
var arr_name = [];
var arr_id = [];
for(var i = 0; files.hasNext(); i++) {
//ファイルの取得
var file = files.next();
//ファイル名とファイルIDの取得
arr_name[i] = file.getName();
arr_id[i] = file.getId();
}
// 配列に格納している部分で、希望するファイル操作のコードを書くようにすれば、そういったマクロになります。
getfilesを使うと、上記のように特定ディレクトリの中にあるファイルをガバっと取得することができます。ただし、イテレーターのままではファイル操作することができないので、forやwhileで順々に取り出していく必要があるわけです。
.hasNext()の意味は、「取得したファイル一覧のうち、まだ処理していないファイルがまだあるかどうかを判別」という感じです。なので、for文は、hasnext()が上限に達するまで、という動きをします。(たぶんwhile文を使った方が適正だと思います。)
なお注意点として、getfilesのメソッドでガバっと取得した場合、その取得したファイルの順番を指定できないという問題点があります。おそらく最終更新日順に取得してしまうようなので、もしもファイル名の順番でないとイヤだ!などの希望がある人は、別途、順番をソートするようにソースコードを準備してあげる必要があります。
【参考】
▼Google Apps Scrpt(GAS)で.getFiles()で取得したデータを並び替える
https://teratail.com/questions/117492
まとめ
GASでファイルのコピーや移動をする際は、makecopy、addFile、removeFileを抑えておけば、ひとまずOKかと思います。
マクロであれこれ自動操作して、GASライフを満喫してください!