1

スプレッドシートの Google App Script フォームからのユーザー入力をプライベート キャッシュに保存しようとしています。

テストスクリプトは次のとおりです。

var cache = CacheService.getPrivateCache();

function onLoad() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet(),
      entries = [{
        name : "Show form",
        functionName : "showForm"
      }];
  sheet.addMenu("Test Menu", entries);
}

function showForm() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(),
      app = UiApp.createApplication(),
      setButton = app.createButton("Set"),
      setHandler = app.createServerClickHandler('setTest');

  setButton.addClickHandler(setHandler);
  app.add(setButton);
  spreadsheet.show(app);
}

function setTest(event) {
  cache.put("test", "test", 7200);

  Browser.msgBox("Test was set: " + cache.get("test") + ". Use the getTest cell formula to test the cache.");
}

function getTest() {
  var result = cache.get("test");

  return result;
}

メニュー ボタンをクリックすると、フォームが表示され、サーバー ハンドラーにキャッシュ値が設定されます。次に、セルで =getTest() を使用してキャッシュから値を取得しようとします。キャッシュが値「test」を返すことを期待しますが、null を返すようです。

ここでこの問題を開始しました: http://code.google.com/p/google-apps-script-issues/issues/detail?id=2039

また、別の同様のものも見つけました: http://code.google.com/p/google-apps-script-issues/issues/detail?id=1804

フォームへのユーザー入力の一部をキャッシュに保存し、後で別の関数からアクセスできるようにしようとしています。

助言がありますか?

4

1 に答える 1

0

カスタム関数の範囲は限定されており、少数の選択されたサービスにしかアクセスできません。それらの制限について詳しくは、こちらをご覧ください。

キャッシュを使用すると、少し注意が必要です。キャッシュは「スクリプト スコープ」ごとに行われます。そのため、キャッシュがサーバー ハンドラー スクリプト スコープから最初にアクセスされると、より多くの権限を持ち、カスタム関数が実行されるスクリプト スコープとは異なる UiApp として実行されます。したがって、キャッシュはこれら 2 つのスコープ間で共有されません。

カスタム関数で設定したキャッシュされたアイテムに他のカスタム関数からアクセスできますが、このキャッシュはこれらの境界を超えることはできません。

理論的にはこれを ScripProperties に保存できますが、これは非常に扱いにくく、これらの機能を悪用することになり、すべてのユーザー間で共有されます。

ScriptProperties.setProperty("test", "test")

var result = ScriptProperties.getProperty("test");

ユースケースをもう少し詳しく説明していただければ、代替ソリューションを提供できるかもしれません。

于 2012-11-02T18:39:33.440 に答える