0

我试图通过回调发送一个数组并且没有运气。让我解释一下我的意图,也许那里的专家可以给我一些关于如何解决这个困境的想法。

我创建了一个收集数据的电子表格。然后,我有一个 UI 脚本,它通过单击复选框将行数据拉入弹性表中,供用户处理。我创建了一个单独的弹性表,其中包含用户选中或留空的复选框。在我的脚本中,我需要发送一个包含复选框条件的数组。为什么?因为我还需要可以推送到电子表格的行号或数组位置,以便为数据发送正确的更新状态。

该脚本仅将需要操作的数据拉入 UI。因此,我可能正在处理电子表格的第 1、3、4、5 和 8 行,但在 UI flextable 上,与数据对应的行是第 1、2、3、4、5 行,因此行分配不会匹配。但是,如果我使用数组,我可以捕获拉出的行是 1、3、4、5 和 8,然后相应地更新电子表格。

但是,当我尝试回调标记为 offset[inc] 的数组时,这就是问题我无法让它工作我得到运行错误,找不到方法 addcallback 并且无法让它工作。

关于如何通过 addcallback 方法发送数组的建议或替代建议将不胜感激。

谢谢,

肖恩·纳兹曼

function doGet(e){
  var app = UiApp.createApplication();

  //Create Caption Panel
  var captionPanel = app.createCaptionPanel('Detention   Attendance').setWidth('350px').setHeight('75px').setStyleAttribute('fontWeight', 'bold').setStyleAttribute('fontSize', '24px');

  //Add a widget to caption panel
  captionPanel.add(app.createLabel("Please enter attendance for Detention by clicking the     checkbox next to the student's name if they were present. Then click Sumbit."));

  //add the caption panel to the application  
  app.add(captionPanel);

  var panel = app.createHorizontalPanel();
  var flexTable = app.createFlexTable().setStyleAttribute('border', '2px solid black')
      .setStyleAttribute('borderCollapse','collapse')
      .setBorderWidth(2)
      .setCellSpacing(50)
      .setCellPadding(6); 

  //Get Data from spreadsheet
  var spreadsheetId = '0Aup0nXQ4K-pydFREb1FFcTFYX3lOenNQenR1Q01jQ1E';   //Change this to     the Spreadsheet ID
  var dataArray = getData(spreadsheetId);
  var inc = 1;
 //Load data into table cells
   for (var row = 0; row<dataArray.length; row++) {
      var booleanCheck =  dataArray[row] [17];
      var offset = new Array();


      if (booleanCheck == "" || booleanCheck == "Date Served") {
         if (row > 0) {
         Logger.log("Row value = " + row);      
         var ticketDate = dataArray[row] [0];
         var dateStamp = Utilities.formatDate(new Date(ticketDate), "America/Chicago", "MM/dd/yyyy");

         dataArray[row] [0] = dateStamp;
         var ticketDate2 = dataArray[row] [16];
         var dateStamp2 = Utilities.formatDate(new Date(ticketDate2), "America/Chicago", "MM/dd/yyyy");
         dataArray[row] [16] = dateStamp2;
         flexTable.setText(row, 1, dataArray[row][2].toString());
         flexTable.setText(row, 0, dataArray[row][0].toString());
         flexTable.setText(row, 2, dataArray[row][16].toString());  
         offset[inc] = row; inc++;
         Logger.log('Inc variable = ' + inc);
         Logger.log('Offset = ' + offset[inc-1]);
     } else {
         Logger.log("Inside ELSE row is not > 0");
         Logger.log("Row value here = " + row);
         flexTable.setText(0, 1, "Student's Name").setStyleAttribute(0, 1, 'fontWeight', 'bold');
         flexTable.setText(0, 0, "Date Assigned").setStyleAttribute(0, 0, 'fontWeight', 'bold');
         flexTable.setText(0, 2, "Date Delinquent").setStyleAttribute(0, 2, 'fontWeight', 'bold');    
       }  
     }
   }
  Logger.log(offset);
  panel.add(flexTable);

  var check1 = app.createCheckBox().setName('ch1');  
  var check2 = app.createCheckBox().setName('ch2');
  var check3 = app.createCheckBox().setName('ch3');
  var check4 = app.createCheckBox().setName('ch4');
  var check5 = app.createCheckBox().setName('ch5');
  var check6 = app.createCheckBox().setName('ch6');
  var check7 = app.createCheckBox().setName('ch7');
  var check8 = app.createCheckBox().setName('ch8');
  var check9 = app.createCheckBox().setName('ch9');
  var submitButton = app.createButton("Submit");
  var handler = app.createServerClickHandler('updateStatus');
  handler.addCallbackElement(check1)
    .addCallbackElement(check2)
    .addCallbackElement(check3)
    .addCallbackElement(check4)
    .addCallbackElement(check5)
    .addCallbackElement(check6)
    .addCallbackElement(check7)
    .addCallbackElement(check8)
    .addCallbackElement(check9)
    .addCallbackElement(offset);
  submitButton.addClickHandler(handler);
  handler.addCallbackElement(check1)
     .addCallbackElement(check2)
     .addCallbackElement(check3)
     .addCallbackElement(check4)
     .addCallbackElement(check5)
     .addCallbackElement(check6)
     .addCallbackElement(check7)
     .addCallbackElement(check8)
     .addCallbackElement(check9)
     .addCallbackElement(offset);

  var table = app.createGrid(11,1).setStyleAttribute('border', '2px solid black')
      .setStyleAttribute('borderCollapse','collapse')
      .setBorderWidth(2)
      .setWidth('75px')
      .setCellSpacing(5)
      .setCellPadding(6);
   table.setStyleAttributes({textAlign: "center"});
   table.setStyleAttribute('fontWeight', 'bold').setText(0, 0, 'Attendance');
   table.setWidget(1,0, (check1));
   table.setWidget(2,0, (check2));
   table.setWidget(3,0, (check3));
   table.setWidget(4,0, (check4));
   table.setWidget(5,0, (check5));
   table.setWidget(6,0, (check6));
   table.setWidget(7,0, (check7));
   table.setWidget(8,0, (check8));
   table.setWidget(9,0, (check9));
   table.setWidget(10,0,(submitButton));

   panel.add(table);
   app.add(panel);
   app.close();
   return app;
}
4

2 回答 2

0

我通常做的是将数组转换为字符串并将其写入小部件的 tage.parameter.widgetName_tag然后我可以在处理函数中使用它来检索它。此时我可以拆分它以取回数组:e.parameter.widgetName_tag.split(',');

join选择and字符时必须小心,split因为您的数据可能包含逗号(这是数组中的默认分隔符)...我经常使用 | 或任何其他“不常见”字符 (Ë,Í;Δ) 与 and 结合使用join('∆')split('∆')因此我确信我会按应有的方式恢复数组。

当然,小部件必须包含在 中,callBackElement但这很容易通过使用最高级别的父 UiApp 元素 as 来实现callBackElement

最后一条评论:尝试使用可以简化您的生活的小部件 ID...例如,使用包含与数组索引(chk0、chk1、chk2...)相对应的数字的 ID,以便您可以轻松检索要使用的数值在你的处理函数中使用类似这样的东西:

Number(e.parameter.source.replace(/[a-z]/ig,''))

这将为您提供一个数字,该数字标识哪个checkBox是处理程序调用的来源,因此您可以编写:

var arrayElement = e.parameter.widgetName_tag.split(',')[Number(e.parameter.source.replace(/[a-z]/ig,''))];
于 2013-06-03T05:59:18.040 回答
0
var array = ['foo','poo'];
var arrayString = JSON.stringify(array);

那时,只需将 arrayString 附加到回调元素,瞧!然后在 handlerFunction 中,使用 e.parameter.arrayString 访问它,然后解析它以将其返回到一个数组,如下所示:

var array = JSON.parse(e.parameter.arrayName);
//array = ['foo','poo']
于 2015-02-28T15:21:34.797 回答