我正在编写一个应用程序,它从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。
有什么想法吗?
答案 0 :(得分:0)
flextables不像电子表格那样工作,你不能直接将小部件值作为表格的一部分。您必须使用e.parameter.Name
单独获取每个textBox和checkBox。
您可以在循环中轻松完成此操作,但您必须知道能够重建名称的textBox数量,就像在doGet
函数中创建它们一样。
我建议将此号码存储在您的某个小部件或单独的隐藏小部件(hidden class或invisible 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=.