0

背景:我有一个谷歌网站,我一直在从一个包含我学生分数的谷歌电子表格中提取信息,但是我想让它更加动态,以便他们可以随时请求报告所有当前分数我喜欢。在我编写的脚本中,学生将输入密码,点击一个按钮,然后他们的分数就会生成。

问题:根据我的阅读,当他们单击按钮时,按钮的处理程序会导致脚本重新运行。当前电子表格无法存储,当我尝试访问电子表格时,它告诉我它为空。如何再次访问电子表格?我尝试过使用 ScriptProperties,但得到了相同的结果。顺便说一句,如果我不尝试将它作为 web 应用程序运行,它就可以工作。

这是 doGet() 函数和 getPassword() 函数的一部分,一旦按下 UI 上的按钮,就会调用该函数。

function doGet() {
  var app = UiApp.createApplication();
  app.add(app.loadComponent("MyGui"));

  var panel = app.getElementById("VerticalPanel1");
  var text = app.createPasswordTextBox().setName("text");
  var handler = app.createServerHandler("getResults").addCallbackElement(text);

  panel.add(text);
  panel.add(app.createButton("Get Record", handler));

  SpreadsheetApp.getActiveSpreadsheet().show(app);
}

function getResults(eventInfo) {
  var app = UiApp.createApplication();
  var password = eventInfo.parameter.text;

  var panel = app.getElementById("VerticalPanel1");
  var textArea = app.createRichTextArea();
  panel.add(textArea);

  var pointsSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var passwordCheckRange = pointsSheet.getRange("B70:C94").getValues();
  ...
4

1 回答 1

1

问题可能是当脚本作为 webapp 运行时没有“activeSpreadSheet”所以 SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 失败。另一种方法是将隐藏字段中的 SpreadSheet id 传递给回调。

在您的 doGet 函数中:

var hidden = app.createHidden('ssId', 'YOUR_SS_ID_HERE');
panel.add(hidden);
var handler = app.createServerHandler("getResults").addCallbackElement(text);
handler.addCallbackElement(hidden)`

在您的回调函数中

var ssID = eventInfo.parameter.ssId;
var pointsSheet = SpreadsheetApp.openById(ssID).getSheetByName('SHEET_NAME');
于 2013-09-20T23:44:13.840 回答