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

   

今日からGoogleスライドで使えるGASのコード一覧

templateLogo_SlidesApp

本記事では、Google Apps ScriptでGoogleスライドに対して使うことができるSlidesAppという処理の一覧表を用意しました。Googleの公式ドキュメントは英語なので、分かりづらいところもありますので、みなさんがそこで挫折しないように日本語で内容が把握できるようにします。

まだすべてのメソッドで日本語での使い方が解説できているわけではありませんが、最終的にはすべての使い方を日本語で解説するページを用意していきます。
日本語化されている記事の見分け方は、簡単な説明列で日本語が記載されているものについては日本語記事が用意できています。メソッド名をクリックすることで対象の記事を閲覧することができます。
日本語の記事が出来上がっていないメソッドについてはGoogleから提供されている公式ドキュメント(英語)へのリンクとなっています。

続きを読む

   

今日からGoogleフォームで使えるGASのコード一覧

templateLogo_FormApp

本記事では、Google Apps ScriptでGoogleフォームに対して使うことができるFormAppという処理の一覧表を用意しました。Googleの公式ドキュメントは英語なので、分かりづらいところもありますので、みなさんがそこで挫折しないように日本語で内容が把握できるようにします。

まだすべてのメソッドで日本語での使い方が解説できているわけではありませんが、最終的にはすべての使い方を日本語で解説するページを用意していきます。
日本語化されている記事の見分け方は、簡単な説明列で日本語が記載されているものについては日本語記事が用意できています。メソッド名をクリックすることで対象の記事を閲覧することができます。
日本語の記事が出来上がっていないメソッドについてはGoogleから提供されている公式ドキュメント(英語)へのリンクとなっています。

続きを読む

   

今日からGoogleサイトで使えるGASのコード一覧

templateLogo_sites

本記事では、Google Apps ScriptでGoogleサイトに対して使うことができるSitesAppという処理の一覧表を用意しました。Googleの公式ドキュメントは英語なので、分かりづらいところもありますので、みなさんがそこで挫折しないように日本語で内容が把握できるようにします。

ただし、Googleサイトは、2016年11月22日に新しいバージョンにアップデートされましたが、Google Apps Scriptは新しいバージョンに対応されていません。下記のコードを利用する際は、以前のバージョンに戻して使う必要がありますのでご注意下さい。
新しいGoogleサイトでは、以前まであったスクリプトエディタという項目がメニューにありませんので利用することができません。
新しいバージョンにもそのうち対応するかと思っていたのですが、もうすでに新しいバージョンがリリースされてから4年以上が経過していますので、今後も新しいバージョンに対応するかは疑問があります。
ちなみに、2021年5月までは旧バージョンのサイトを作成できたのですが、今現在は作成することもできなくなりました。そのため、下記コードはすでにサイトを旧バージョンで作成済みのファイルでのみ利用できるものとなります。
一応レガシーとして情報掲載だけしておこうかと思います。

SitesAppの概要

SitesAppとは、Google Apps ScriptでGoogleドキュメントに対する操作を行うコードですが、SitesAppに用意されているメソッドでは、次のような操作を行うことができます。

  • ページへのファイル添付
  • カラムの操作
  • コメントの操作
  • リストの操作
  • ページの操作
  • サイトの操作

続きを読む

   

今日からGoogleマップで使えるGASのコード一覧

templateLogo_maps

本記事では、Google Apps ScriptでGoogleマップに対して使うことができるMapsという処理の一覧表を用意しました。Googleの公式ドキュメントは英語なので、分かりづらいところもありますので、みなさんがそこで挫折しないように日本語で内容が把握できるようにします。

まだすべてのメソッドで日本語での使い方が解説できているわけではありませんが、最終的にはすべての使い方を日本語で解説するページを用意していきます。
日本語化されている記事の見分け方は、簡単な説明列で日本語が記載されているものについては日本語記事が用意できています。メソッド名をクリックすることで対象の記事を閲覧することができます。
日本語の記事が出来上がっていないメソッドについてはGoogleから提供されている公式ドキュメント(英語)へのリンクとなっています。

続きを読む

   

今日からGoogleドキュメントで使えるGASのコード一覧

DocumentApp

本記事では、Google Apps ScriptでGoogleドキュメントに対して使うことができるDocumentAppという処理の一覧表を用意しました。Googleの公式ドキュメントは英語なので、分かりづらいところもありますので、みなさんがそこで挫折しないように日本語で内容が把握できるようにします。

まだすべてのメソッドで日本語での使い方が解説できているわけではありませんが、最終的にはすべての使い方を日本語で解説するページを用意していきます。
日本語化されている記事の見分け方は、簡単な説明列で日本語が記載されているものについては日本語記事が用意できています。メソッド名をクリックすることで対象の記事を閲覧することができます。
日本語の記事が出来上がっていないメソッドについてはGoogleから提供されている公式ドキュメント(英語)へのリンクとなっています。

DocumentAppの概要

DocumentAppとは、Google Apps ScriptでGoogleドキュメントに対する操作を行うコードですが、DocumentAppに用意されているメソッドでは、次のような操作を行うことができます。

  • ドキュメントファイルの作成
  • アクセス権限の編集
  • ドキュメントファイルの修正

続きを読む

   

今日からGoogleスプレッドシートで使えるGASのコード一覧

Google Apps Scriptではスプレッドシートを操作するための基本的なコードがSpreadsheetAppという名称で用意されています。
今回は、SpreadsheetAppのリファレンスを用意しました。コードの数がかなり多いですが、非常によく使う機能が集まっていますので、プログラマーを目指していなくても、作業効率が飛躍的に向上しますのでぜひ覚えてほしいコード達です。

続きを読む

       

【徹底検証】GASでセルから最も効率的に値を取得する方法とは?

今回はGASを使ってスプレッドシートの処理をする際に処理速度改善において考慮するべき事を紹介しようと思います。
GASでの処理高速化について、他のブログでもよく取り上げられるgetValues()を使って高速化することについては他のブログなどに紹介は任せるとして、本記事では私の経験上有効である考える手法を紹介したいと思います。

この記事ではできるだけ他のブログでは紹介されていないような内容の記事を目指します。

続きを読む

   

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

icon_For_DriveApp_getLastUpdated

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

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

続きを読む