使用过滤的电子表格数据填充Google Apps FlexTable,并将更改返回到电子表格

时间:2014-02-28 14:33:44

标签: database google-apps-script handler flextable

我正在编写一个应用程序,它从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)

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

我已成功激活单击复选框,该处理程序在单击复选框时运行;但是,我还没有成功找到一种从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。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

flextables不像电子表格那样工作,你不能直接将小部件值作为表格的一部分。您必须使用e.parameter.Name单独获取每个textBox和checkBox。

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

我建议将此号码存储在您的某个小部件或单独的隐藏小部件(hidden classinvisible 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=.