如何在扩展电子表格的Google脚本上的按钮事件处理程序中传递数据?

时间:2014-10-28 11:29:12

标签: javascript google-apps-script google-sheets

扩展Google电子表格,我运行一个脚本,在侧边栏中显示一些数据。在底部我想添加一个按钮来邮寄数据。

但是我无法弄清楚数据如何从按钮传递到处理程序:

  1. 无法将数据传递到事件调用中;
  2. 无法从事件信息中获取按钮对象,我只能获取ID,如果我无法访问uiInstance(在处理函数之外创建),则无用。
  3. 那么诀窍是什么?

2 个答案:

答案 0 :(得分:0)

在将服务器处理程序分配给按钮之前,必须将一个回调元素(可能是包含所需内容的面板)添加到服务器处理程序中。例如:

function myFunction() {
  var app = UiApp.createApplication();
  var panel = app.createVerticalPanel();
  panel.setId('myPanel').add(
    app.createTextBox().setName('boxExample')).add(
    app.createListBox().setName('listExample').addItem('A').addItem('B'));
  //                                                       ↓↓ this is what you need ↓↓
  var handler = app.createServerHandler('callbackFunction').addCallbackElement(panel);
  var btn = app.createButton(btn, handler);

  app.add(panel.add(btn));
  //show app...
}

function callbackFunction(e) {
  var app = UiApp.getActiveApplication();
  app.getElementById('myPanel').add(
    app.createLabel(e.parameter.boxExample)).add(
    app.createLabel(e.parameter['listExample']));
  return app;
}

答案 1 :(得分:0)

使用PropertiesService

我发现(我不知道如何)Google Script提供名为PropertiesService的数据存储服务。

假设,在这种情况下,数据仅供用户使用,我需要先存储数据:

var userProperties = PropertiesService.getUserProperties()
userProperties.setProperty("myKey", "myValue")
// Note myValue will be a string, so to store an array, 
// you'd need JSON.stringify(myArray)

然后,当调用按钮处理程序时,脚本可以轻松地检索数据:

var userProperties = PropertiesService.getUserProperties()
var myValue = userProperties.getProperty("myKey")

使用隐藏窗口小部件

另一种选择似乎是使用"hidden" widget

 function doGet() {
   var app = UiApp.createApplication();
   // Note that the name "appState" for callbacks, and the id "hidden" for
   // getting a reference to the widget, are not required to be the same.
   var hidden = app.createHidden("appState", "0").setId("hidden");
   app.add(hidden);
   var handler = app.createServerHandler("click").addCallbackElement(hidden);
   app.add(app.createButton("click me!", handler));
   app.add(app.createLabel("clicked 0 times").setId("label"));
   return app;
 }

 function click(eventInfo) {
   var app = UiApp.createApplication();
   // We have the value of the hidden field because it was a callback element.
   var numClicks = Number(eventInfo.parameter.appState);
   numClicks++;
   // Just store the number as a string. We could actually store arbitrarily complex data
   // here using JSON.stringify() to turn a JavaScript object into a string to store, and
   // JSON.parse() to turn the string back into an object.
   app.getElementById("hidden").setValue(String(numClicks));
   app.getElementById("label").setText("clicked " + numClicks + " times");
   return app;
 }

(来自链接参考的代码)