-Advanced Google Services

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でGoogleドライブにファイルを作成する

icon_for_DriveApp_createFile

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

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

続きを読む

【コピペで使える】GASで添付のzipファイルを展開してドライブに保存する

前回のブログではファイルをzip形式にしてメールを送る方法を紹介いたしました。

【コピペで使える】GASでファイルをzipにしてメール添付してみる

今回はその逆となる

メールに添付されてるzipファイルを展開しそのファイルをGoogleドライブに保存する

といった作業を自動で取得するスクリプトをご紹介します。

続きを読む

【コピペで使える】GASでファイルをzipにしてメール添付してみる

日々の業務の中で添付メールを送る機会は結構な頻度であります。

その中にはGoogleドライブ保存してある複数ファイルをzipに圧縮し、Gmailに添付して送信を行う

といった作業を行なっている方もいるかと思います。

毎日の業務で同じファイルを送る作業はたとえ短くても、積み重なると結構な時間が使われてしまいます。

そこで今回は、

ファイルをzipに圧縮する方法

メールに添付し送信する方法

をスクリプトで実行する方法をご紹介します。

この方法で自動送信が可能になり作業効率化が可能になりますのでぜひ覚えていってください。

続きを読む

Googleドライブのショートカット機能追加と複数フォルダ所属機能の終了

Shortcut_Feature_Now_Available

Googleドライブではかねてからファイルやフォルダに複数の親フォルダをもたせることができ、Windowsなどのローカルドライブのショートカットのような使い方をすることができました。2020年3月27日にGoogleの公式ブログの記事(英語)にてショートカット機能の追加と複数フォルダへの所属機能の廃止が発表されました。今回はこちらの記事を日本語訳して発表内容の理解をしてみたいと思います。まずは、新しい機能のショートカット機能ですが、こちらに公式の説明記事(日本語)がありましたのでリンクを貼っておきます。

続きを読む

【GAS】Googleカレンダー編集時に発動するトリガーを使いこなす

onEditTriggerForCalendar

カレンダー編集時に発動するカレンダートリガー

2018年2月26日のGoogle Apps Scriptのアップデートでカレンダーの編集を引き金に、Google Apps Scriptのプログラムを実行するトリガーが追加されました。

これでカレンダーを編集時に編集した情報を取得できるぞ!と喜んでいた私ですが、GASでカレンダー関連の処理を行う基礎的なCalendarAppではあまり大したデータが取得できないことが分かり一人落胆したことも記憶に新しい出来事です。

続きを読む