【问题标题】:Need to call back an array in Google Script需要在 Google Script 中回调一个数组
【发布时间】:2012-10-31 14:56:31
【问题描述】:

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

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

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

但是,当我尝试回调标记为 offset[inc] 的数组时,问题就出现了

将不胜感激有关如何通过 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;
}

【问题讨论】:

    标签: javascript arrays callback google-apps-script


    【解决方案1】:

    我通常做的是将数组转换为字符串并写在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,''))];
    

    【讨论】:

    • 在写入标签之前你不能转换成 json 吗?可能会解决加入和拆分的问题!
    • 这确实也是一个不错的方法。更多的“学术”可能:-) 感谢您的建议
    【解决方案2】:
    var array = ['foo','poo'];
    var arrayString = JSON.stringify(array);
    

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

    var array = JSON.parse(e.parameter.arrayName);
    //array = ['foo','poo']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 2017-11-20
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多