Google表格应用程序脚本神秘错误

时间:2014-08-24 04:01:20

标签: google-apps-script google-sheets

我正在上课,在课堂上我将所有学生的成绩保存在Google电子表格中。在我的网站上,我想以个人身份向学生提供信息。我创建了一个应用程序,在其中显示密码文本框。他们输入密码,然后从电子表格中检索对他们来说唯一的信息,并在标签中将它们呈现给他们。我一直试图将这一切都整合在一起,但是它没有正常工作,而且我得到了一个我无法诊断的错误。如果我使用Browser.msgBox()打印出信息,它会输出信息,但否则会产生错误。为什么会发生这种情况?解决方法是什么?这是代码:

var pointsSheet = SpreadsheetApp.openById('1o8_f063j1jYZjFEnI_P7uAztpnEAvQ6mc3Z1_Owa69Y');

//creates and shows an app with a label and password text box
function doGet() {
  var app = UiApp.createApplication().setTitle('Incomplete Challenges');

  var mygrid = app.createGrid(1, 2);
  mygrid.setWidget(0, 0, app.createLabel('Password:'));
  mygrid.setWidget(0, 1, app.createPasswordTextBox().setName("text"));

  var mybutton = app.createButton('Submit');

  var submitHandler = app.createServerClickHandler('getResults');
  submitHandler.addCallbackElement(mygrid);
  mybutton.addClickHandler(submitHandler);

  var mypanel = app.createVerticalPanel();
  mypanel.add(mygrid);
  mypanel.add(mybutton);
  app.add(mypanel);

  SpreadsheetApp.getActiveSpreadsheet().show(app); 
  //return app; //UNCOMMENT WHEN DEPLOYING APP
}

//obtains data based on password entered by user and outputs their info
function getResults(eventInfo) {
  var app = UiApp.createApplication().setTitle('Incomplete Challenges');
  var password = eventInfo.parameter.text;

  var passwordCheckRange = pointsSheet.getRange("B34:C34").getValues();

  if (passwordCheckRange == null) {
    Browser.msgBox("Error: Range is null");
    return app;
  }

  var name;
  for(var i = 0; i < passwordCheckRange.length; i++) {
    if(passwordCheckRange[i][1] == password) {
      name = passwordCheckRange[i][0];
      break;
    }
  }

  var studentRecordRange = pointsSheet.getRange("B3:AY29").getValues();
  var headingRange = pointsSheet.getRange("B1:AY2").getValues();

  if (studentRecordRange == null) {
    Browser.msgBox("Error: Range is null");
    return app;
  }

  var requestedRecord;
  for(var i = 0; i < studentRecordRange.length; i++) {
    if(studentRecordRange[i][0] == name)
      requestedRecord = studentRecordRange[i];
  }

  var stringRecord = "";
  for(var i = headingRange[1].length-1; i >= 7; i--) {
    if (requestedRecord[i] == "")
      stringRecord += headingRange[1][i] + ": " + headingRange[0][i] + "XP" + "\\n";
  }

  var mygrid = app.createGrid(2, 1);
  mygrid.setWidget(0, 0, app.createLabel('INCOMPLETE CHALLENGES'));
  mygrid.setWidget(1, 0, app.createLabel(stringRecord));

  var mypanel = app.createVerticalPanel();
  mypanel.add(mygrid);
  app.add(mypanel);


  //Browser.msgBox(stringRecord);
  return app;
}

我遇到的错误是:遇到错误:发生了意外错误。

你可以看到它非常有用。

2 个答案:

答案 0 :(得分:2)

第28行应该是 getActiveApplication ()而不是 createApplication() 。 您无法在其他应用程序上创建应用程序。 :)

另外我认为第63行应该是"<br>";而不是#34; \ n&#34 ;;与第68行一样,它应该是 createHTML 而不是 createLabel

我还认为你已经应用了几个样式css,以便你的应用程序看起来很好。检查UiApp中的.setStyleAttributes。

答案 1 :(得分:1)

此代码中存在一些错误,第一个产生错误的错误是(在另一个答案中提到)处理函数中的UiApp.createApplication()

您无法在处理函数中创建UiApp实例,您应该获取活动实例并最终向其添加元素(使用UiApp.getActiveApplication())。

您既不能更改此实例的标题。顺便说一句,它没有意义,因为当你将这个应用程序部署为webapp时,这个标题不会显示为“标题”。它只会显示在浏览器窗口的顶部(作为页面标题),因为您的应用程序将占据整个屏幕,而不再是模式弹出窗口。因此,如果您希望在Ui中显示标题,只需将其添加为HTML小部件,您可以在其中选择字体大小和重量(以及任何其他CSS样式)。

另一个错误是在密码检查中,您正在使用Browser.msgBox("Error: Range is null");但是浏览器类在UiApp中不起作用。您应该只使用UiApp元素,而不是spreadSheetApp元素。

而且,作为更一般的评论,我建议您使用应用的.dev网址(上次保存的版本)直接测试您的应用(在保存测试版并部署之后),以便您处于“真实状态” “使用条件并对结果有相关的pov。