Google Apps Scriptでカスタムプロパティを使う【GAS】
Google Apps ScriptにはGoogle Driveを検索するDriveAppというクラスが存在しているのですが、このクラス実はGoogle Driveの全ての機能を網羅していません。その為、Google Driveで自分が行っている動作(例えば、相手に通知をしないでオーナー権限を変更する)といった動作をしたくても、DriveAppでは出来ません。
一方で、Google Apps ScriptはDrive API v2が使えるようになっており、こちらはGoogle Driveでの全ての動作に関してメソッドをサポートしています。しかしこの中には、表向き見えない機能についてのメソッドがあります。それが「カスタムプロパティ」。今回はこのカスタムプロパティについて調べてみました。
目次
今回使用するファイル
カスタムプロパティとは?
概要
Google Cloud Next 2019での発表の中で「Google Driveのファイルに色々メタデータつけられるよ」という発表がありましたが、そもそも、Google Drive API v2からは、ファイルに対して自分で好きなタグというかプロパティを設定できる「カスタムプロパティ」という機能が備わっています。
この機能自体はかなり前から存在しているものの、Google Drive上からは見えない設定であるため、あまり知られていないようです・・・自分がこの機能に目をつけた事の発端は、「DriveAppのsearchFilesで日本語ファイル名で検索すると一部のファイルが検出されない」というバグに気がついて、なんとか指定のファイルをリストアップできないかな?と思って探したのがこの機能でした。
カスタムプロパティ自体はJSONのキーバリューのように{key : "kinoko", value:"マツタケ", visibility:"PUBLIC"}といったように付加が出来、また、それを元にsearchFilesのクエリで検索させる事ができるようになっています。メタデータとは違うようです。
また、Drive上では設定するUIが存在しないので、利用する場合には管理用のアプリケーションとスプレッドシートを作っておくと良いでしょう。
※前回の記事のスクリプトプロパティとは全く違う機能です。
制限
カスタムプロパティの付加には以下の制限があります。
- 1つのファイルに付けられるカスタムプロパティは100個まで
- 1つのファイルに設定できるPUBLICプロパティは30個まで
- 1つのアプリケーションから設定できるPRIVATEプロパティは30個まで
- UTF8エンコードでプロパティの最大文字列数は124バイトまで(keyとvalue合わせて)
- カスタムプロパティの設定はパフォーマンスに影響を及ぼします
- appProperties(単一のアプリケーションからだけに制限)とProperties(すべてのアプリケーションから見える)の2種類にわかれる
とのこと。パフォーマンスの下りがどれだけ影響するか?といっても日常使用レベルでは取り上げるまでもないレベルじゃないかなと思います。
事前準備
Google Apps Scriptから利用するためには、Cloud Consoleへの紐付け設定が必要になります。
また、以下の作業も必要です。
- スクリプトエディタのメニューより「リソース」⇒「Googleの拡張サービス」
- Drive APIを見つけて、ONにする
図:Drive APIはDriveAppとは異なります。
コードと結果
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
var fileId = "ここにファイルのIDを入れる" //カスタムプロパティを追加する function addCustomProperty() { var property = { key: 'ここにキーを入れる', value: 'ここに値を入れる', visibility: 'PUBLIC' }; Drive.Properties.insert(property, fileId); } //対象ファイルカスタムプロパティを取得する function getCustomProperty(){ //対象のIDのキーの名前を指定 var ret = Drive.Properties.get(fileId, 'キーの名前', {visibility: 'PUBLIC'}); //キーに対応する値が返ってくる Logger.log(ret); } //カスタムプロパティでドライブを検索する function searchDrive() { //検索するクエリを構築する var args = { corpus: "DEFAULT", maxResults: 10, q: "properties has {key='キーの名前' and value='キーに対応する値' and visibility='PUBLIC'}" }; //検索を実行する var ret = Drive.Files.list(args).items; //検索結果をログに表示 Logger.log(ret); } |
- addCustomProperty関数が、対象のファイル(ID)に対して、カスタムプロパティを追加する機能になります。
- visibilityの設定は必ず付けましょう。
- Drive.Properties.insertでプロパティをセットします。何度も行なうと何個も追加されます。
- Drive.Properties.getで指定したファイル(ID)の指定したキーに対する値を拾ってきます。
- searchDrive関数が、Drive APIにてGoogle Driveを検索するメソッドになります。
- Drive.Files.listに検索クエリを追加し、itemsで拾えます。値はJSONで返ってきます。
- 検索クエリでは、properties hasに続けて、キー、値、visibilityを必ず付けます。
- argsに設定できるオプションは色々あります。
結果
今回は適当な公開ファイルに対して、カスタムプロパティをセットしてみました。Drive APIでのitemsの返り値は非常に多くの情報が返ってくるので、DriveAppとは異なり扱いやすいかもしれません。
1 2 3 4 5 6 7 8 9 |
[{ properties=[{ visibility=PUBLIC, kind=drive#property, etag="**************************", value=matsutake, key=kinoko }], }] |
- 検索の結果、kinokoというキーにmatsutakeというカスタムプロパティがついているのが確認できました。
- visibilityがPUBLICなので全てのアプリケーションから参照が可能になっています。
API Explorerでの検証方法
これらのカスタムプロパティについては、スクリプト上だけでなく、Drive REST APIのページからも検証が可能です。例えば、Drive.Files.listの場合はこちらのページから。
listの場合には、ファイルIDを入れてExecuteボタンを押すだけです。認証が発動しますので許可をして完了。下のほうに返り値として、JSON値が出てきます。ここにも以下のような形で値を確認できます。もちろん、Insertやgetでも同様です。実際にタグが付いてしまうので、扱いは注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 |
{ { "kind": "drive#property", "etag": "*******************", "selfLink": "**********************", "key": "kinoko", "visibility": "PUBLIC", "value": "matsutake" } ] } |
図:実際にAPIを実行してテストが可能
関連リンク
- Edit custom file properties in Google Drive UI
- Drive.Properties.get() - specify visibility
- Drive REST API v2 Properties:list
- Google Drive REST API v2 file properties array in Google Apps Script is undefined?
- how to find files not owned by me in Google apps script
- Drive REST API v3 Search for Files
- drive.files.list query on properties not working #426
- Invalid Value Error when Searching for Google Drive files based on multiple property values