Google Apps ScriptとGoogle ドライブのシステムを開発する

Google Apps ScriptとGoogle ドライブのシステムを開発する

Google ドライブはパソコン、タブレット、モバイルデバイスからファイルやフォルダを保存・共有・共同編集することができるオンラインストレージサービスです。個人のGmailアカウントでは15GBから無料で使え、Google Workspaceの場合、Starterプランで30GBから利用可能です。

Google Workspaceのアプリ以外にも、Microsoft Office のファイル(Word、Excell、PowerPointなど)でも共同編集でき、ファイル形式を変換する必要もありません。他にも HTML、PDF、画像といった、100 種類以上のファイルを編集、保存できます。

非常に利便性が高い一方、特にGoogle Workspaceでの活用においては、企業側のセキュリティポリシの運用上、外部への共有に制限がかかり、社内共有に留まっている状況もあります(この点については、別途エントリーをまとめる予定です)。

今回のブログでは基本的なGoogle ドライブの使い方ではなく、また特段共有に制限がかかってないことを前提として、GoogleドライブとGoogle Apps Script(グーグルアップススクリプト、GAS)を使ってどんなことができるのかをまとめていきたいと思います。

ちなみに、実は以前にnoteでGoogleドライブを活用したGASの事例についてはまとめたことがあります。

今回は公式リファレンスを確認しつつ、GoogleドライブとGASを使ってどんなことができるのかを確認していってみたいと思います。以下の説明ではソースコードについては省略し、またGoogle Apps Scriptのスクリプトエディタに表示されるログの結果を元に説明を進めたいと思います。

GoogleドライブのフォルダIDとファイルIDについて

今後、Googleドライブを使って様々な処理を実現していきますが、その際にどのフォルダやファイルに対して処理をするのか、ということを指定しないといけません。これを何で指定するかというと、Googleドライブではフォルダやファイルに一意のIDが付与されますので、このIDを使っていくというわけです。

GASを開発する人にとっては必須の知識ですが、利用者の場合も知っておいて損はない事柄です。ファイルIDを意識することで、GASの操作や利用がスムーズに進むといったことがでてくるかと思います。

実際の確認方法を以下に示します。
まず、Googleドライブに特定のフォルダにアクセスすると、ブラウザでURLが確認できます。この時表示される下記の赤枠内の部分がIDとなります。

GoogleDrive_10

同様に、以下の[ID]の部分がフォルダIDになります。

https://drive.google.com/drive/u/1/folders/[ID]

ファイルIDについても同じように確認できます。スプレッドシートなどのGoogle Workspaceアプリの場合は、スプレッドシートを開いて以下のように確認できます。

GoogleDrive_11

同様に、以下の[ID]の部分がフォルダIDになります。

https://docs.google.com/spreadsheets/d/[ID]

GoogleドライブにアップしたPDFや画像ファイルの場合は、確認方法が少し異なります。Googldドライブのプレビューから「新しいウィンドウ」で開いたURLから確認することができます。

GoogleDrive_12
GoogleDrive_13

同様に、以下の[ID]の部分がフォルダIDになります。

https://drive.google.com/file/d/[ID]

以上がGoogle ドライブのフォルダIDとファイルIDの確認方法です。

 Google ドライブにあるファイルやフォルダをGoogle Apps Scriptで操作する

Google ドライブにあるファイルの情報をGoogle Apps Scriptで全取得する

それでは実際にGoogleドライブとGoogle Apps Scriptでできることを実例を交えて説明していきます。まずはGoogleドライブにあるファイルの名前を全て取得してみます。下記はログの一部ですが、ファイル名の一覧を取得しています。

GoogleDrive_01

ファイル名だけではなく、IDやURL、MIME Type、最終更新日など、ファイルに関する様々な情報も取得することができます。下記は、取得した情報をオブジェクトとしてまとめてログ出力したものです。これらの取得した情報を元に、スプレッドシートにURLを出力するとか、ファイル種別で絞り込みをかけるとか、最終更新日の日付をみて動作条件を変えるといった後々の処理に役立てることができます。

GoogleDrive_02

Google ドライブにある特定のフォルダのファイルの情報をGoogle Apps Scriptで取得する

先ほどはGoogleドライブにある全てのファイルの情報を参照しましたが、実際に何かを作ろうと思った場合、いちいち全ての情報を参照しにいくのはリソースの無駄ですし、利用用途としてはあまり一般的ではないかと思います。実際は、ある特定のフォルダを基準にして様々な処理を行っていくという方が自然です。
Google Workspaceのアプリ(例えばGoogleドキュメントやGoogle スプレッドシート)には、それぞれ固有のIDが存在しており、Googleドライブのフォルダにも当然ですがIDはあります。GASで特定のフォルダを指定する場合には、このIDを指定する場合が多いです。

以下はマイドライブ直下にある「Google Apps Script」というフォルダ内のファイル名を全て取得してきた結果です。左側が実際のGoogleドライブのファイルで、右側がGASのスクリプトエディタのログ上の結果になります。

GoogleDrive_04

Google ドライブにある特定のフォルダで新しいファイルをGoogle Apps Scriptで作成する

先ほどはファイルの一覧を取得したGoogleドライブのフォルダに新しいファイルを作成してみます。ファイル作成はGoogle ドライブで対応しているMIME Typeであれば一通り作成することができます。GoogleスプレッドシートやGoogleドキュメントはもちろん、PDFなんかも大丈夫です。また、フォルダも作成することができます。

今回は先ほどのフォルダに新しいフォルダを作成し、その中にHTMLファイルを作成してみます。
今回は一つのファイルだけを作成していますが、複数のファイルを一括で作成するといったこともできます。
新しいフォルダを作成しつつ、同時にファイルを作成するといったこともできますね。
筆者の場合だと、あるスプレッドシートにGASを使ってCSVやGoogleドライブの情報を収集し、定期的に実行するトリガーを使って、新しいファイルを複数作成する、みたいな使い方をすることが多いでしょうか。

GoogleDrive_05

Google ドライブにある特定のフォルダで一定時間以内に更新されたファイルをGoogle Apps Scriptでゴミ箱に移動する

ファイルを大量に作成できるようになると、今度はフォルダ内のファイル整理が課題となってきます。

以下では、現在の時刻とファイルの更新時刻を比較して1時間以内のファイルはゴミ箱に移動するといったことを行っています。また、逆にゴミ箱から元のフォルダに戻すといったことも自動で行えます。下記の画像では一番左がゴミ箱移動前、真ん中がゴミ箱移動後、右側がゴミ箱から戻した状態です。

GoogleDrive_07
GoogleDrive_08
GoogleDrive_09

定期的に古い情報のファイルをゴミ箱に移動するといった用途は多そうですね。この際、日付や時刻で参照する以外にも、ファイルのタイプ種別やファイル名などで絞り込みをかけて実行するといったこともできます。

Google ドライブのフォルダ・ファイルの共有範囲と権限について

Googleドライブのフォルダ・ファイルには共有範囲と権限があります。
共有範囲というのは、フォルダやファイルを「インターネット上の誰もが検索してアクセスできる」か「許可されたユーザーのみがアクセスできる」のかといった指定のことです。
権限というのはフォルダやファイルに対して「編集者」なのか「閲覧者」なのかといったパーミッションのことです。

Googleドライブのフォルダ・ファイルの共有範囲について

公式リファレンスのEnum Accessに一覧が乗っていますが、以下にも概要を示しておきます。
プロパティ 説明
ANYONE インターネット上の誰もが検索してアクセスできる
ANYONE_WITH_LINK リンクを知っている全員がアクセスできる
DOMAIN ドメイン内の誰もが検索してアクセスできる
DOMAIN_WITH_LINK リンクを知っているドメイン内の全員がアクセスできる
PRIVATE 許可されたユーザーのみがアクセスのみがアクセスできる

デフォルトではPRIVATEの設定になっています。
また、Google Workspaceユーザーであれば、DOMAINおよびDOMAIN_WITH_LINKが使えます。なお外部共有を不可にしている場合は、共有範囲とその権限をANYONEやANEONE_WITH_LINKに設定することはできません(ただし、Google Workspace Business Standard以上であれば、部門ごとの外部共有設定ができますので、これを利用すれば特定部門だけ外部共有可能にするといったことも行えます)。
ANYONEやANEONE_WITH_LINKを使えば、サインインせずにフォルダ・ファイルへのアクセスが可能になります。よって、この指定をすれば、ファイルを共有したい相手がGmailアカウントをもっていなくてもファイル共有が可能になります。例えばGoogleスプレッドシートをANEONE_WITH_LINKに設定し、権限を編集者として設定すれば、Gmailアカウントを持っていなくてもスプレッドシートの編集を行うことができます。

Googleドライブのフォルダ・ファイルの権限について

公式リファレンスのEnum Permissionに一覧が乗っていますが、以下にも概要を示しておきます。
プロパティ 説明
VIEW 閲覧者:閲覧、コピーが可能
EDIT 編集者:閲覧(コメント可)の他、編集および共有が可能
COMMENT 閲覧者(コメント可):閲覧の権限の他、コメントが可能
OWNER オーナー:すべての権限を持つ
ORGANIZER 管理者:共有ドライブの管理をする権限を持つ
FILE_ORGANIZER コンテンツ管理者:共有ドライブのコンテンツの管理をする権限を持つ
NONE 権限なし:権限がない状態

フォルダやファイルを作成したユーザーがオーナーとなります。ファイル作成時はオーナー以外には共有されてないため、他のユーザーは全てNONEになります。
また、ORGANIZE、FILE_ORGANIZERは共有ドライブのための権限です。共有ドライブはGoogle Workspace Standard以上で利用可能で、特定のオーナーを持ちません。例えば営業部門で各種資料を保存する共有ドライブを用意するといった使い方ができます。共有ドライブであれば部署異動や退職で誰かがいなくなっても、オーナーを引き継ぐなどといった必要性がなくなります。

余談ですが、Gmailアカウントがオーナーのファイルと特定ドメインのGoogle Workspaceアカウントにオーナー引き継ぎをしようとしても引き継ぎはできないようです。

Google Apps ScriptでGoogle ドライブの権限を変更しファイルを共有する

Google Apps Scriptを用いて、Googleドライブの共有範囲や権限の変更を行うこともできます。

まずは特定のGoogleドライブのフォルダの権限を確認してみましょう。

GoogleDrive_14

先ほど作成したNewFolderのドライブにオーナー以外に「編集者」「閲覧者」としてそれぞれ共有しています。こちらの情報をGoogle Apps Scriptを使って取得してみます。今回はそれぞれの権限を保有するメールアドレスと名前を取得してみることにします。

以下がGASのスクリプトエディタのログになります。

GoogleDrive_15

上記の通り、編集者(Editor)、閲覧者(Viewer)、オーナー(Owner)として情報の取得ができています。今回はフォルダの情報を取得しましたが、もちろんファイルについても同様に取得できます。また、いわずもがな複数のフォルダやファイルの情報についても取得することができます。

では次に、この取得した権限の情報を元に変更を加えることを実施してみたいと思います。

今回は編集権限のユーザーを閲覧権限に変更してみます。この際、まず編集権限のユーザーの共有を一度外し、その上で閲覧権限を改めて付与するという風にしています。このあたりは設計次第ですが、権限を外す処理と付与する処理を分けておけば、特定の条件のユーザーは権限を外すのみおこない、その他のユーザーは権限変更するという風に切り分けができますね。

また、権限だけでなく共有範囲についてもGASで変更可能なので、今回はANEONEの「インターネット上の誰もが検索してアクセスできる」状態にしてみたいと思います。

まずは実行前の状態を確認してみます。下記がGoogleドライブで確認できるGAS実行前の状態です。

GoogleDrive_16

下記がGAS実行後の状態です。

GoogleDrive_17

真ん中のユーザーの権限が変更され、またウィンドウ下部の「リンクを取得」部分が制限付きから「インターネット上の全員が検索、閲覧できます」に変更されていることが確認できます。

もちろんこれらの操作はGoogleドライブのUI上で権限変更を実施することは可能です。ですが、複数ファイルを複数人行うといったケースにおいてはGASを使って一括実行する方が圧倒的に時間が短縮できますよね。また、何かの処理(GoogleスプレッドシートやGoogleフォームでの操作)と合わせてこれらの権限や共有範囲を変更したいといった場合はGASで処理を加えるのが必須となってくるかと思います。

権限についてはGASで処理を加えれば、一定期間経過後は編集や閲覧権限を外すといったことも可能です。ユーザー毎に権限付与した時間を保存しておくような仕組みをつくれば、ユーザー毎に権限の変更や削除もできるようになるというわけです。

Google Apps ScriptでGoogle ドライブのファイルをPDFとして書き出す

次はGoogle Apps Scriptを用いて、GoogleドライブにあるファイルをPDFとして書き出しを実行してみたいと思います。これまでに作成したHTMLファイル以外に、新たにGooogleドキュメントのファイルも一つ用意しました。

GoogleDrive_18

後ほどPDF化した場合との比較のために、念の為下記に各ファイルを開いた場合の画像も掲載しておきます。

GoogleDrive_19
GoogleDrive_20

今回は指定したIDのフォルダにあるファイルについて、ルートフォルダにPDFフォルダを作成し、各ファイルをPDFとして出力し直すということをやってみます。

ちなみに、少し技術(開発)的な話になりますが、各ファイルを変換するためにはGAS専用のBlobというオブジェクトとgetAsメソッドを用いて変換することになります。このgetAsメソッドで色々と変換したいところですが、変換できるものは限定的です。画像形式だとBPM, GIF, JPEG, PNG、ドキュメント形式はPDFのみとなっています。

GoogleDrive_21

比較のために、PDFファイルの中身を開いてみます。

GoogleDrive_22
GoogleDrive_23

PDFに変換できるていることを確認できました。

Google Apps Scriptで指定したフォルダのファイルのダウンロードURLをGoogle スプレッドシートに書き出す

関係者に対して特定のファイルのダウンロードURLをまとめて伝えたいといった場合に、GoogleスプレッドシートにダウンロードURLをまとめてあると便利そうですよね。
そのようなシーンをイメージして、例えば先ほどPDF書き出ししたファイルのダウンロードURLをGoogleスプレッドシートを新規作成して書き出すということをGASでやってみたいと思います。

処理としては、まずスクリプトエディタでPDFを書き出したフォルダIDを指定して、該当フォルダ内のダウンロードURLを取得します。その次に、Googleスプレッドシートをルートフォルダに新規作成し、ダウンロードURLやファイル名を記入したシートを作成して全てのファイルの情報を書き込む、といった具合になります。

スクリプト実行後は、下記のようにルートフォルダに指定したフォルダと同名のファイルがルートフォルダに作成されていることが確認できます。

GoogleDrive_24

次にこのGoogleスプレッドシートを開くと、ダウンロードURL等が記載されているシートが生成されていることを確認できます。

GoogleDrive_25

Google Apps Scriptで指定したフォルダのファイルを移動する

あるフォルダから別のフォルダにファイルを移動するということもGoogleドライブを使っていると遭遇するシーンかと思います。これも一つや二つなら手動で全然問題ないのですが、複数フォルダの複数ファイルなどといってくると、非常に煩雑な作業になりますし、何かの処理と絡めて〜となるとお手上げです。これもGoogle Apps Scriptを使って解決していきましょう。

先ほどのPDFフォルダにあるファイルを全て、movedというフォルダを作って移動してみます。

スクリプトを実行してルートフォルダへアクセスするとmovedというフォルダができていることを確認できます。

movedフォルダにアクセスすると(画像左)、さきほどのPDFフォルダに入っていたファイルがあることが確認できます。また、PDFフォルダにアクセスすると(画像右)空になっておりmovedフォルダに移動した状態となっていることがわかります。

GoogleDrive_27
GoogleDrive_28

なお、ファイルを作成し、移動するといったことも可能です。以下は、New FileというGoogleスプレッドシートを生成しつつ先ほどのmovedフォルダに入れた状態です。

Google Apps ScriptでGoogleドライブ内のフォルダやファイルを検索する

最後に、Googleドライブ内のフォルダ・ファイル検索についてもGoogle Apps Scriptで実行してみたいと思います。今回は、Googleドライブにあるファイル名を検索し、その結果をGoogleスプレッドシートに出力するといった内容のものです。

Googleドライブ内のフォルダやファイルの検索については、スクリプトエディタ内でGoogle Drive SDK documentationにあるクエリーパラメーターや演算子を用いて実行します。タイトル以外にもMimeType(ファイル種別)や作成日といった条件も利用できますので、用途にあわせてチューニングするといったことができると思います。

今回はGoogleスプレッドシートにGoogle Apps Scriptでカスタムメニューを追加し、そこからファイル名を入力するダイアログ画面を表示させ入力を受け付け、検索結果を返してみます。下記はカスタムメニューとして「ファイル検索」を追加した状態です。

 

GoogleDrive_30

この「ファイル検索」をクリックすると下記のダイアログが表示されます。今回は「new」がつくファイルを検索してみます。

すると、下記のようにGoogleスプレッドシート側へファイル名や該当ファイルのURLが出力されます。

前述したように検索条件は様々に設定できるので、ダイアログ画面で絞り込み条件を付け加えるなどすることによって、より柔軟な検索結果を返すといったことも可能になってくると思います!

いかがでしょうか?この他にもできることは様々にあります。今後も定期的にこのブログでGASでできる様々なことをアップデートしていきます。

なお、上記で紹介したGoogleスプレッドシート/Google Apps Scriptをご利用になれたい方は、お問い合わせフォームよりご連絡いただければ、ファイルをシェアいたします。お気軽にお問合せください!

コメントする

メールアドレスが公開されることはありません。

CAPTCHA