繁体   English   中英

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

[英]Populate Google Apps flexTable with filtered Spreadsheet Data and returning changes to spreadsheet

我正在编写一个应用程序,用于从条件与查询匹配的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 Spreadsheet。

我已经成功激活了单击复选框时运行的单击处理程序。 但是,我尚未成功找到一种方法来从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。

有什么想法吗??

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

您可以轻松地循环执行此操作,但是您必须知道textBox的数量,才能像在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=.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM