0

我编写了一个 Google 应用程序脚本,它首先在 UI 应用程序中创建并显示一个折线图,然后使用 Click-button 事件处理程序根据选定的列表框值重新绘制图形,以在图形“刷新”时触发。

我试图解决的问题是,当触发点击事件时作为 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;
}
4

2 回答 2

0

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

于 2012-08-06T20:40:09.733 回答
0

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

我建议您更改处理程序以调用另一个函数(可能是 lb)而不是 doGet。

于 2012-08-06T17:35:28.650 回答