とある理由で、PropertiesやCache以外でデータを保存する方法を検討しました
MetadataFinderを使わないと見つけられないのでソース修正しました
#1.PropertiesとCache
どちらも、そのスクリプト内でしか利用できないんですね。
なんでこんな話になったかというと、
スプシAのスクリプトから、スプシBのスクリプトへデータを渡す
をやりたかったのですが、Propertiesは
let props = PropertiesService.getScriptProperties();
props.setProperty("key","value");
なので、スプシAのスクリプトからプロパティを呼び出すと、当然、スプシAのスクリプトのプロパティとなり、スプシBのスクリプトのプロパティをとることはできません
(設定も同じ)
Cacheも同じ構成をとっているので、こちらも同一スクリプトなり同一ドキュメント内に限定されます。
ユーザープロパティを使えばできるのかもしれませんが、別なユーザーでも動かしたい、と。
#2.DeveloperMetadata
クラスリファレンスをつらつら見ていたら、Metadataというものがあるようで、スプシやレンジ等に設定できる模様。
正しい使い方か微妙でしたが、スプシのMetadataに渡したいデータを埋め込んでみました
埋め込む側
let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
let meta = spreadsheet.createDeveloperMetadataFinder().withKey("my_Meta_key").find();
let value = meta.find(item => item.getKey() == "my_Meta_key");
if(value === undefined){
spreadsheet.addDeveloperMetadata("my_Meta_key","my_Meta_Value");
return "my_Meta_value";
}
return value.getValue();
読み込む側
let spreadsheet = SpreadsheetApp.openById("B_fileId");
// let meta = spreadsheet.getDeveloperMetadata();
let meta = spreadsheet.createDeveloperMetadataFinder().withKey("my_Meta_key").find();
let value = meta.find(item => item.getKey() == "my_Meta_key");
if(value === undefined){
return "no meta-data";
}
return value.getValue();
3/20追記:MetadataFinderを使わないと見つけられないので修正
#3.ScriptId
実は、スクリプトのIDを集めるために上記のことをやるハメになったのですが、ScriptIdも
let scriptId = ScriptApp.getScriptId();
なので、自分のスクリプトIDしかわからないようです。
#4.Metadataのスコープ
スコープ、がただしい表現か微妙ですが、以下の3つにMetadataは設定できるようです
Spreadsheet
Sheet
Range
すべて、
addDeveloperMetadata
で作成できるようになっています。
#5.DeveloperMetadata
私のGoogle力がたりないのか、ほとんど情報みつからなかったんですが、だれも使わないのでしょうか。
普通は、Propertiesで足りるからかもしれません
(スプレットシートのシートに直に書く、という方法もレガシーながらあり)