GAS 单击事件处理程序导致 UI Web 应用中出现"Unexpected Error"



我编写了一个 Google Apps 脚本,该脚本首先在 UI 应用程序中创建并显示折线图,然后使用在图形"刷新"时触发的点击按钮事件处理程序根据选定的列表框值重新绘制图形。

我试图解决的问题是,当发布为 Web 应用程序时,当触发我收到的点击事件时:

遇到错误:发生意外错误

代码从电子表格完美运行(除了一些讨厌的权限问题,要求其他用户下载面板对象;我稍后会谈到这一点),我真的很想知道为什么它不会翻译。

这是它的价值的代码:

function doGet(){
  var app = UiApp.createApplication().setWidth(800).setHeight(650).setTitle('FLEET Chart');
  var e = 'undefined';
  lb(app);
  return click(e, app);
 }
function lb(app){
  var lb = app.createListBox(true).setId('myId').setName('myLbName');// add items to ListBox      
  var lb2 = app.createListBox(true).setId('myId2').setName('myLbName2');
  var lb3 = app.createListBox(true).setId('myId3').setName('myLbName3');
  var bttn = app.createButton('Refresh').setId('myBttn');
  lb3.addItem('2011').addItem('2012');
  lb2.addItem('January')
     .addItem('February')
     .addItem('March')
     .addItem('April')
     .addItem('May')
     .addItem('June')
     .addItem('July')
     .addItem('August')
     .addItem('September')
     .addItem('October')
     .addItem('November')
     .addItem('December');
   lb.addItem('Drug1')    
     .addItem('Drug2')    
     .addItem('Drug3')    
     .addItem('Drug4');
  var mypanel = app.createHorizontalPanel().setVisible(true);
  mypanel.add(lb).add(lb2).add(lb3).add(bttn);
  app.add(mypanel);
  var handler = app.createServerChangeHandler('click').addCallbackElement(mypanel);
  handler.addCallbackElement(bttn);
  bttn.addClickHandler(handler);
}
function click(e, app) {
  var valuelb = new Array('Drug1','Drug2','Drug3','Drug4');
  var valuelb2 = new Array    ('January','February','March','April','May','June','July','August','September','October','November','December');
  var valuelb3 = new Array('2011','2012');
  var SS = SpreadsheetApp.openById('0Am8DRqAEaxH7dF9NWFJLSTdWZGRxeEFfMkFjNlFCT2c');
  var sheeteff = SS.getSheetByName('Efficiency');
  var data = sheeteff.getDataRange().getValues();
  if (String(e) != 'undefined') {
    app.setWidth(800).setHeight(650).setTitle('FLEET Chart');
    var valuelb = String(e.parameter.myLbName);
    if (valuelb.indexOf(',') != -1) {
      var valuelb = e.parameter.myLbName.split(',');
    }
    var valuelb2 = String(e.parameter.myLbName2);
    if (valuelb2.indexOf(',') != -1) {
      var valuelb2 = e.parameter.myLbName2.split(',');
    }
    var valuelb3 = String(e.parameter.myLbName3);
    if (valuelb3.indexOf(',') != -1) {
      var valuelb3 = e.parameter.myLbName3.split(',');
    }
    SS.getSheetByName('Sheet2').getRange(1,1).setValue(String(valuelb2) + ' ' + valuelb.indexOf(','));//for unformation purposes
    lb(app);
  }else{
    SS.getSheetByName('Sheet2').getRange(1,1).setValue(String(e));//for information purposes
  }
  var usedata = ArrayLib.filterByText(ArrayLib.filterByText(ArrayLib.filterByText(data, 3, valuelb), 1, valuelb2), 0, valuelb3);
  //Build data table
  var dataTable = Charts.newDataTable();
  //Add Column types
  dataTable.addColumn(Charts.ColumnType.DATE, data[0][2]);
  dataTable.addColumn(Charts.ColumnType.NUMBER, data[0][9]);
  dataTable.addColumn(Charts.ColumnType.NUMBER, data[0][8]);
  //Add rows
  for(var j=0; j<usedata.length; j++){
    dataTable.setValue(j, 0, usedata[j][2]);
    dataTable.setValue(j, 1, usedata[j][9]);
    dataTable.setValue(j, 2, usedata[j][8]);
  }
  //Create and build chart
  var chart = Charts.newLineChart()
      .setDataTable(dataTable)
      .setTitle('Efficiency over Time nConfiguration: [' + valuelb + ']n' + 'Month: [' + valuelb2 + ']n' + 'Year: [' + valuelb3 + ']')
      .setXAxisTitle('Time')
      .setYAxisTitle('Percentage')
      .setDimensions(750, 600)
      .setPointStyle(Charts.PointStyle.MEDIUM)
      .build();
  app.add(chart);
  return app;
}

我没有浏览您的整个代码,但肯定看到错误 - 您已将 doGet 设置为要在处理程序上调用的函数。除了您尝试第二次调用 UiApp.createApplication() 之外,这没有问题,这是不允许的。

我建议你更改处理程序以调用另一个函数(lb,也许)而不是doGet。

我的代码中也有"意外错误"。为了修复它们,我编写了一个简单的库,它有助于查找服务器处理程序中的问题。下面是一个演示如何使用库的示例。示例源代码在这里。若要将库添加到脚本,必须在Resources->Manage Libraries对话框中使用 Mr6TKHuVEJGjYr-NnLUNbEkFO7CoOZA03 项目键。库使用 ScriptProperties 服务来存储自己的内部变量。

相关内容

  • 没有找到相关文章