今回の記事では、Googleドライブ上でファイルの新しいバージョンを追加する方法について書いていきたいと思います。
このページをご覧頂いている方々はもうご存知の方がほとんどだと思いますが、Google Apps ScriptのDriveAppでは、Googleドライブ上の様々な操作をプログラムで実行させることができます。
Googleドライブ上の操作とは例えば、
- 新しいファイルを作成
- 既存ファイルのファイル名を変更
- ファイルを他のフォルダに移動
といったユーザーが一般的にGoogleドライブのUI上で操作できることの大部分をプログラムで実行することができます。
ただし、GASのDriveAppで全ての操作を行う事ができるわけではありません。
DriveAppでできない操作とは
DriveAppを使ってできないことの一つが、ファイルの新版をアップロードするという機能です。
DriveAppで既存ファイルを新ファイルに置き換えをする場合、既存ファイルをsetTrashedでゴミ箱に捨ててから、createFileを使って新しいファイルを同じ場所に作成するということになると思います。
新版をGoogleドライブのUI上でアップロードする方法は、既存ファイルと同一のファイル名のファイルをアップロードするか、ファイル名の上で右クリックすると表示される『版を管理』という項目から新版のアップロード操作を行うことができます。
版とは所謂バージョンのことですが、この機能を使うと、以前のバージョンを復元することができたりと便利な場面が色々あります。
そこで、今回の記事では、DriveApp以外の方法でGoogleドライブを操作して新版をアップロードする方法をお伝えします。
Advanced Drive Serviceについて
前述の通り、DriveAppでは新板アップロードはできないのですが、GASではAdvanced Drive ServiceというDriveAppでは網羅されていない操作を行う仕組みが用意されています。
DriveAppは利用することが比較的容易ですが、Advanced Drive Service(DriveAPI)ではファイルのカスタムプロパティへのアクセスや、変更履歴の操作など独自の操作を行うことができるようになっています。
例えば、下記のコードはどちらもGoogleのロゴ画像を最上位のマイドライブに作成するコードですが少し書き方が異なります。
ファイル作成するコード
//DriveAppでファイルを作成するコード function createFileByDriveApp() { let image = UrlFetchApp.fetch("http://goo.gl/nd7zjB").getBlob(); let title = "google_logo_by_DriveApp.png"; let file = DriveApp.createFile(image); file.setName(title); } //Advanced Drive Service(DriveAPI)でファイルを作成するコード function createFileByDriveAPI() { let image = UrlFetchApp.fetch('http://goo.gl/nd7zjB').getBlob(); let file = { title: 'google_logo_by_DriveAPI.png', mimeType: 'image/png' }; file = Drive.Files.insert(file, image); }
処理は同じですが、コードの書き方が少し異なります。
サンプルコードは『DriveAppとDriveAPIの書き方の違い』で実行可能なものを用意しています。
ちなみに、DriveAPIを利用する際には、事前にスクリプトファイルのサービスにDriveAPIを有効化させる必要があります。有効化の仕方は動画にしましたので、参考にしてください。
DriveAPIを使って新版をアップロードする
前置きが長くなりましたが、次にDriveAPIを使って新バージョンをアップロードする方法をご紹介します。
DriveAPIは慣れていない方には少し複雑に感じるかもしれませんが、実はそこまで難しくはありませんので、下記のコードを参考にしてもらえればと思います。
アップロードを実演するために、簡単なウェブアプリを用意しましたので、アクセスして実行ボタンをクリックしてみてください。
ウェブアプリ『新バージョンアップロードの実演アプリ』
対象のファイルはこちらにありますので、実行ボタンをクリック後にファイルを右クリックし『版を管理』をクリックしてみてください。新バージョンがアップロードされていることが確認できます。
現行バージョンも新バージョンも同じGoogleのロゴ画像となりますので、ファイルの見た目には変更はありません。
さて、気になる新バージョンをアップロードするためのサンプルコードは下記になります。
ファイルの新バージョンをアップロードするコード
//ファイルの新バージョンをアップロードするコード function updateFile() { let fileId = "1JndQLJfAwA_SOFiD6Df77AV_dALxbESQ"; //新バージョンアップロード対象のファイルID let blob = UrlFetchApp.fetch('http://goo.gl/nd7zjB').getBlob(); let resource = { uploadType: "media", } Drive.Files.update(resource, fileId, blob); }
コードとしてはこれだけで新バージョンをアップロードできますので、とてもシンプルです。
Googleドライブでは、1つのファイルにつき最大で100個のバージョンを保持できるようです。100個を超える場合は古いバージョンから削除されていく仕様です。バージョン情報さえ持っていれば、古いバージョンのデータをダウンロードすることもできるようになっています。
新バージョンアップロードコードの解説
新バージョンをアップロードするためには、Drive.Files.updateというメソッドを利用します。
第一引数はresourceとなっていますが、これはアップロードに関するオプション設定のような位置づけで、オブジェクトで指定することができます。
let resource = {
uploadType: "media", //multipart or resumableも指定可能(必須パラメータ)
addParents: "親フォルダID",
includePermissionsForView: "", //閲覧権限の設定
keepRevisionForever: boolean, //バージョン情報を永久に保存するかどうかの設定(ドライブ上で最大200個までしか永久保存履歴は持つことができない)
ocrLanguage: "jp", //OCR機能を利用する際に言語のヒントとなる情報を設定(ISO 639-1コードで記載)
removeParents: "フォルダID", //フォルダからファイルを取り除く場合
supportsAllDrives: boolean, //マイドライブと共有ドライブの両方をサポートする場合true(デフォルト値はfalse)
useContentAsIndexableText: boolean //インデックス対象として利用するかどうかを設定(デフォルト値はfalse)
}
必須パラメータはuploadTypeのみとなります。
第二引数では、対象となる既存ファイルのIDを指定し、第三引数には新バージョンファイルのBlobデータを指定します。
ちなみに、Googleスプレッドシートやドキュメントなどのファイルには履歴管理機能がありますが、今回ご紹介したDriveAPIを使った方法では履歴に対する操作などは行うことができません。また、ファイル更新の概念が一般的なファイルとこれらのファイルは違うようで、版の管理を行うことができません。(ドライブのUI上でもこれらのファイルには版の管理という項目がありません。
まとめ
今回は、ファイルのバージョン管理をするためにGASで新しいバージョンをアップロードする方法をご紹介しました。DriveAppだけでは実現できない内容となっていますので、今まで諦めていた方もいたかもしれませんが、今回のサンプルコードを参考にやり方を身につけてもらえればと思います。