3

みなさん、こんにちは。

ハンドラー関数内でグローバル変数を使用できますが、関数内で「グローバルに」変更することはできません。

以下のコードでは、最初のクリック後に数値1001が表示されます(ハンドラーが読み取り、インクリメントし、正しい結果を表示します)。ただし、それ以上クリックすると常に1001が表示されるため、ハンドラーは元のglobalVar値を読み取り続けます。期待どおりに変更されません。

これを修正するために私にできることはありますか?

var globalVar = 1000;

function testingGlobals() {
  var app = UiApp.createApplication();
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var panel = app.createVerticalPanel().setId('panel');
  app.add(panel);
  panel.add(app.createButton(globalVar).setId("globalVar").addClickHandler(app.createServerHandler("chgGlobal").addCallbackElement(panel)));
  doc.show(app)
}

function chgGlobal(e) {
  var app = UiApp.createApplication();
  globalVar++;
  app.getElementById("globalVar").setText(globalVar);
  return app;
}
4

2 に答える 2

6

ハンドラーが実行されるたびにグローバル変数が初期化されてから操作されるため、この方法でグローバル変数をインクリメントすることはできません。非表示のフォームフィールドを使用して、ハンドラーで変更できる変数を保持できます。この変数は、アプリが開いている限り永続的です。

例えば

function testingGlobals() {
  var app = UiApp.createApplication();
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var panel = app.createVerticalPanel().setId('panel');
  var myVar = app.createHidden().setValue('0').setName('myVar').setId('myVar');
  panel.add(myVar);
  app.add(panel);
  panel.add(app.createButton('0').setId("globalVar").addClickHandler(app.createServerHandler("chgGlobal").addCallbackElement(panel)));
  doc.show(app)
}

function chgGlobal(e) {
  var app = UiApp.createApplication();
  gloabalVar = parseInt(e.parameter.myVar);
  gloabalVar ++;
  app.getElementById('myVar').setValue(gloabalVar.toString());
  app.getElementById("globalVar").setText(gloabalVar);
  return app;
}
于 2012-09-23T07:20:01.233 に答える
3

グローバルプロパティの代わりに、CacheService(高速ですが保証されていません)またはScriptPropertiesまたはScriptDb(少し遅いですが永続化されます)でデータを永続化できます。特にScriptDbは、文字列を使用せずにオブジェクトを保持できます。

于 2012-09-24T19:21:15.403 に答える