DriveApp

GASでGoogleドライブのファイルに新しい版をアップロードする方法

DriveApp_vs_DriveAPI_Upload_a_New_File_Versions

今回の記事では、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とDriveAPIの書き方の違い
//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だけでは実現できない内容となっていますので、今まで諦めていた方もいたかもしれませんが、今回のサンプルコードを参考にやり方を身につけてもらえればと思います。

【コピペで使える】GASでフォルダ/ファイルの最終更新日時を取得してみる

icon_For_DriveApp_getLastUpdated

今回のメソッドは、Googleドライブでファイルの編集日時を取得するgetLastUpdated()メソッドの使い方をご紹介します。ファイルを編集すると更新時間が随時変更されていきますが、このメソッドを使うことで最終更新日時を取得することができます。更新日時がわかることで、期間を限定してある特定の期間に編集されたフォルダやファイルを取得したりすることができます。

使い方はgetDateCreated()メソッドと同じですので、簡単に使えるようになると思います。

続きを読む

【コピペで使える】GASでフォルダ/ファイルの作成日時を取得してみる

icon_For_DriveApp_getCreatedDate

今回のメソッドは、Googleドライブでファイルの作成日時を取得するgetDateCreated()メソッドの使い方をご紹介します。ファイルが一番最初に作成された日時は一度編集などをされてしまうと手動で確認するには編集履歴を確認するしか無いと思いますが、このメソッドを活用すれば簡単に作成日時を取得することができます。使用用途としては、作成日順でソートしたりでしょうか。あるいは、作成から○日後に処理を行うなどもできるかもしれませんね。

今回はこのgetDateCreated()メソッドの使い方を学んでいきたいと思います。

続きを読む

【コピペで使える】GASでGoogleドライブにフォルダを作成する

icon_For_DriveApp_CreateFolder

今回はGASでGoogleドライブに新規フォルダを作成するcreateFolderというメソッドをご紹介します。

こちらのメソッドを使えるようになると、バッチ処理として一括でフォルダを作成したりといった処理が簡単に行えるようになります。私も単純作業をしているときなどはよくスプレッドシートとこのようなシンプルな機能を組み合わせてバッチ処理を行っています。この部分だけを取り上げてみてもGASを学んでよかったなぁと思える部分の一つであると感じています。

続きを読む

【コピペで使える】GASでGoogleドライブにファイルを作成する

icon_for_DriveApp_createFile

今回はGASでGoogleドライブに新規ファイルを作成するcreateFileというメソッドをご紹介します。
Googleドライブにファイルを保存するというのは日常的によくある場面かと思いますので、使用頻度は高いのではないかなと思います。

例えば、受信メールの添付ファイルやスクレイピングした画像データを的にGoogleドライブに保存したりといった使い方が思い浮かびます。
そういった場合に利用するのが今回ご紹介するcreateFileというメソッドになります。

続きを読む

【コピペで使える】GASでドライブの保存容量と使用量を取得する

icon_for_DriveApp_getStorageLimit_and_getStorageUsage

今回はGoogleドライブのストレージ容量とストレージ使用量を取得するgetStorageLimitとgetStorageUsedについてご紹介します。どういう風に活用すれば良いのか私の想像力が及びませんが、GASではとても簡単にストレージ容量と使用量を確認するためのメソッドが用意されています。GASでは本当にいろいろなメソッドが用意されていますね。

使用用途としては、思い浮かぶものとしては、ファイルアップローダーで現在どのくらいの空き容量があるのかを出力したり、残容量によって処理を分岐させたりということで使えるのかもしれません。

続きを読む

Google Apps Scriptでドライブのフォルダやファイルを取得してみる

icon_for_DriveApp_getFiles_and_getFolders

今回の記事は、Google Apps Scriptを使ってGoogleドライブ上のファイルを取得する方法を紹介していきます。GASでフォルダやファイルを取得する方法はそれぞれいくつかあるのですが、取得方法にそれぞれ結構な違いがありますのでこの記事ではそれぞれの使い方をまとめて紹介したいと思います。GASでドライブ上のフォルダやファイルに対して処理を行う場合には、まずは対象のアイテム(フォルダやファイル)を取得する必要があります。

続きを読む

【コピペで使える】GASでドライブに新規フォルダを作成する

icon_for_DriveApp_createFolder

今回はGoogle Apps Scriptを使ってGoogleドライブ上に新規フォルダを作成するcreateFolder()メソッドをご紹介しようと思います。
本記事では、createFolderがどのような挙動をするのかをイメージしやすくするために、簡単なウェブアプリを通して挙動を確認できるようにしてあります。

Googleドライブ上に新規フォルダを作成する— createFolder()

続きを読む

GASでフォルダから別フォルダを非表示にする(現在非推奨)

icon_for_DriveApp_removeFolder

フォルダから他のフォルダの所属を解除する— removeFolder()

※『Googleドライブのショートカット機能追加と複数フォルダ所属機能の終了』の記事で記載の通り、2020年9月30日をもって本記事で紹介しているremoveFolderは非推奨となりました。

今回紹介するメソッドは、Googleドライブのフォルダに格納されている他のフォルダの所属を解除する方法をご紹介します。

続きを読む