0

我正在编写一个应用程序,它从 Google 电子表格中的行中提取任务数据(用于任务管理系统),条件匹配查询。然后,我将此数据发送到带有 onClickHandler 的复选框旁边的 flexTable 以及用于输入小时数据的文本框。下面是我如何实现这一目标的最简单示例:

\\establish handler for checkboxes that are generated in flexTable
var updateHandler = app.createServerClickHandler('updateTasksfunc');
updateHandler.addCallbackElement(taskTable);

\\search Google Spreadsheet for rows matching condition
for(var i=1; i< taskData.length; i++){
   if (taskData [i][1] !=employee){
     continue;      
   }

\\look up if task is already completed, and set checkbox value to true/false
var complete = taskData[i][8].toString();
if(complete==="true"){var checkbox=true;}else{var checkbox=false;}

\\populate flexTable with values from spreadsheet query
taskTable.setWidget(i,0,app.createTextBox().setName('hours'+i).setWidth('50').setId("hour"+i)).setWidget(i,1,app.createCheckBox().setValue(checkbox).setName('complete'+i).addClickHandler(updateHandler)).setWidget(i,2,app.createLabel(taskData[i][2]).setWidth('250')).setWidget(i,3,app.createLabel(taskData[i][3]).setWidth('250')).setWidget(i,4,app.createLabel(taskData[i][4])).setWidget(i,5,app.createLabel(taskData[i][5])).setWidget(i,6,app.createLabel(taskData[i][6])).setWidget(i,7,app.createLabel(taskData[i][7])).setWidget(i,8,app.createTextBox().setVisible(false).setName("dataRow"+i).setValue(i))
}

\ 编辑 doGet()

var numberOfItems = app.createTextBox().setName('rows').setValue(i).setVisible(false);
var rows1 = i+1;
taskTable.setWidget(rows1,0,numberOfItems)

我已将电子表格数据行存储在 flex 表第 8 列的不可见文本框中,我打算在 clickHandler 函数中使用它来更新 Google 电子表格。

我已成功激活单击复选框时运行的单击处理程序;但是,我还没有成功地找到一种从 flexTable 中获取数据的方法,我可以用它来更新电子表格。

//下面的功能代码

function updateTasksfunc(e){
  var app = UiApp.getActiveApplication();

  var taskSS = SpreadsheetApp.openById('SPREADSHEETID');
  var taskSH = taskSS.getSheets()[0];
  var taskData = taskSS.getDataRange().getValues();

  var results = [];// an array to collect results
  var numberOfItems = e.parameter.rows; 
  app.add(app.createLabel(numberOfItems));
  for(var n=0;n<numberOfItems;n++){
    results.push([e.parameter['check'+n]]);// each element is an array of 2 values
  }
  for(var i=1;i<results.length;i++){
    var check = results[i][0];
    var row = i+1;
    taskSH.getRange(row,9,1,1).setValue(check);
  }
return app;  
} 

我收到一个通用错误:无法从通用中找到函数 getRowCount()。

我认为这意味着我没有正确调用我的 flexTable。

有什么想法吗??

4

1 回答 1

0

flextables 不像电子表格那样工作,您不能直接将小部件值作为表格的一部分。您必须使用e.parameter.Name.

您可以在循环中轻松完成此操作,但您必须知道文本框的数量才能重建名称,就像在doGet函数中创建名称一样。

我建议将此数字存储在您的一个小部件上的标签中或单独的隐藏小部件(隐藏类不可见的 textBox)中。然后你将能够得到这样的值:

...
var results = [];// an array to collect results
var numberOfItems = Number(e.parameter.itemNumbers); // this is the var you are missing right now and need to add. This is the solution of a separate hidden widget
for(var n=0;n<numberOfItems;n++){
  results.push([e.parameter['hours'+n],e.parameter['complete'+n]]);// each element is an array of 2 values
  }
... // from here you will have an 2D array with all your values and you can continue like you did=.
于 2014-02-28T17:30:37.553 回答