需要在Google Script中回拨一个数组

时间:2012-10-31 14:56:32

标签: javascript arrays callback google-apps-script

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

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

该脚本仅将需要操作的数据提取到UI中。因此,我可能会在电子表格的行1,3,4,5和8上执行操作,但在UI灵活性上,与数据对应的行是1,2,3,4,5行,因此行分配不会比赛。但是,如果我使用数组,我可以捕获拉出的行是1,3,4,5和8,然后相应地更新电子表格。

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

有关如何通过addcallback方法或备用建议发送数组的建议将不胜感激。

谢谢,

Sean Nutzman

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;
}

2 个答案:

答案 0 :(得分:0)

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

选择joinsplit字符时必须小心,因为您的数据可能包含逗号(这是数组中的默认分隔符)...我经常使用|或任何其他'罕见'字符(Ë,Í;Δ)与join('∆')split('∆')结合使用,所以我确信我可以恢复该数组。

当然,小部件必须包含在callBackElement中,但这可以通过将最高级别的父UiApp元素用作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,''))];

答案 1 :(得分: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']