1

すべてのコードをライブラリにアウトソーシングしたいのですが、ScriptPropertiesを使用して、コードを使用するすべてのスプレッドシートの永続的なグローバル変数( "mode":"edit"や"data"など)を設定および取得しています。

仕様によると、ライブラリにホスティングスクリプトに書き込むことはできませんScriptProperties:https ://developers.google.com/apps-script/guide_libraries#scoping

スクリプトのプロパティ(**):ライブラリで作成すると、スクリプトを含むすべてのユーザーに同じインスタンスが表示されます。

**これは、ライブラリにリソース/機能の独自のインスタンスがあり、ライブラリを使用するすべてのスクリプトが共有し、同じインスタンスにアクセスできることを意味します。

したがって、これにより、単一のコードライブラリを使用してすべてのスプレッドシートにグローバルを設定することが不可能になります。

ScriptPropertiesと組み合わせたライブラリのこの欠点に対する回避策または解決策はありますか?

ありがとう、そしてすべての最高

マリオ

4

4 に答える 4

1

解決策は、ホスティングScriptPropertiesのインスタンスをライブラリに渡すことです。つまり、次のようなものです。

function test() {
  var props = ScriptProperties.getProperties();
  MyLib.func1(props);
}

MyLib.gs

function func1(props) {
  var mode = props["mode"];
  //  ...
}

ホスティングスクリプトが複数のスプレッドシートを処理する場合、プロパティキーの一部としてスプレッドシートIDを使用できます。たとえば、IDXYZ000と。を持つ2つのスプレッドシートがありXYZ001ます。ホスティングスクリプトには、一連のプロパティが含まれています

  • XYZ000.mode=normal
  • XYZ001.mode=extended

ホスティングスクリプトはアクティブなスプレッドシートIDを受け取り、それをプロパティとともにライブラリメソッドに渡します。

洗練されたソリューションは、スプレッドシートの設定クラスを用意し、ホスティングスクリプトのプロパティに、処理されるすべてのスプレッドシートの設定クラスのJSON文字列表現を保存し、スプレッドシートIDを使用してプロパティからスプレッドシート設定を読み込み、設定インスタンスを渡すことです。図書館へ。これがサンプルコードです。

function Settings(mode) {
  this.mode = mode;
};

function setDefaultSettings() {
  var ID0 = "XYZ000";
  var SettingID0 = new Settings("normal");
  ScriptProperties.setProperty(ID0, SettingID0);
}

function test() {
  var props = ScriptProperties.getProperty("XYZ000");
  MyLib.func1(props);
}
于 2012-10-02T09:22:00.040 に答える
0

これが私がこれを解決しようとした方法です...

すべてのプロパティをライブラリに保存してから、ライブラリでgetterおよびsetter関数を使用して、呼び出し元のスプレッドシートがこれらの値に簡単にアクセスできるようにします。

呼び出し元のスプレッドシートのIDを使用して、プロパティ名の複合キーを作成します。関数は、フルキー(複合)、「ベア」キー、および値を含むオブジェクトを呼び出し元に返します(検証、エラーチェックなど)。

library.gs

セッター

function setLibPropForSpreadsheet(key, keyValue)
{
var theCaller = SpreadsheetApp.getActiveSpreadsheet().getId();
  var fullKey = theCaller + '-' + key;
  ScriptProperties.setProperty(fullKey, keyValue)
  var theResult = new Object();
  theResult.value = keyValue;
  theResult.key = key;
  theResult.fullKey = fullKey;
  return(theResult);
}

ゲッター

function getLibPropForSpreadsheet(key){
 var theCaller = SpreadsheetApp.getActiveSpreadsheet().getId();
  var fullKey = theCaller + '-' + key;
  return(ScriptProperties.getProperty(fullKey));
}

次に、これらの関数を呼び出し元のスプレッドシートスクリプトで使用できます。

Spreadsheet.gs

function setIt() {
var test =  getData.setLibPropForSpreadsheet("thesetting", "the value")
    Logger.log(test)
}

function getIt(){
 Logger.log(getData.getLibPropForSpreadSheet("thesetting"))
  }
于 2012-10-02T17:24:52.860 に答える
0

または、もう少しエレガントに、より再利用しやすいようにコーディングすることもできます...

スプレッドシートを複数のユーザーが使用し、それぞれに独自の設定が必要な場合に役立つ機能も含まれています。

/**
 *Returns a script property from the library file to a calling script

 * @param {string} key The name of the scriptProperty property to return.
* @return {string} the string value of the key passed
 */

function getLibraryProperty(key) {
  return ScriptProperties.getProperty(key);
}

/**
 *Returns the appropriate library property for the calling spreadsheet.
 * @param {string} key The name of the scriptProperty property to return.
* @return {string} the string value for the key passed

 */

function getLibPropForSpreadsheet(key){
  return(ScriptProperties.getProperty(setkey_(key).fullKey));

}
/**
 *Returns the appropriate library property for the calling spreadsheet by user
 * @param {string} key The name of the scriptProperty property to return.
 * @return {Object.<string,string>} Object containing the key, full key, and value
 */
function getLibPropForSSUser(key){
  return(ScriptProperties.getProperty(setkey_(key).fullUserKey));
}
/**
 *Returns the appropriate library property for the calling spreadsheet.
 * @param {string} key The name of the scriptProperty property to return.
 * @return {Object.<string,string>} the string value of the key passed
 */
function setLibPropForSpreadsheet(key, keyValue)
{
  return(setLibProp_(key, setkey_(key).fullKey, keyValue));
}

function setLibPropForSSUser(key, keyValue)
{
    return(setLibProp_(key, setkey_(key).fullUserKey, keyValue));
}

function setLibProp_(key, fullKey, keyValue){
  ScriptProperties.setProperty(fullKey,keyValue)
  var theResult = new Object();
  theResult.value = keyValue;
  theResult.key = key;
  theResult.fullKey = fullKey;
  return(theResult);
} 

function setkey_(key){
var theCaller = SpreadsheetApp.getActiveSpreadsheet().getId();
 var theUser = Session.getEffectiveUser().getEmail();
 var fullUserKey = theCaller + '-' +theUser+ '-' + key;
 var fullKey = theCaller + '-' + key; 
  var theKeys = new Object();
  theKeys.fullUserKey = fullUserKey;
  theKeys.fullKey = fullKey;
  return(theKeys);
}
于 2012-10-02T18:54:17.990 に答える