在GAS中存储控制指针数组

时间:2014-09-14 09:11:29

标签: google-apps-script

下面的代码运行正常,它使用占位符填充FlexTable,占位符表示日历(列)上的天数,对应酒店中的房间(行)。删除了一些脱离上下文的代码,因此此处显示的代码将不会执行。但客户端处理程序所做的是在选择时隐藏任何单元格的每个房间(整个列),然后第二个客户端处理程序取消隐藏所选单元格。这可以防止用户在同一天注册2个房间,并使体验更具互动性。到目前为止,非常好。

当然,在重置日历时,我还有一些其他代码循环选中每个单元格,并使用控件ID取消隐藏相关列中的所有单元格以引用网格位置。但应该可能的是,引用与用于构造clienthandler的实际控件相同的数组。

那么简单,是否可以存储类引用数组? CacheService和PropertiesService都只存储字符串 - 我错过了什么吗?

var vCaledarSelectors = {};

for(var r=0; r<iRows; r++){   
  for(var c=1; c<iCols+2; c++){

    var sControl = 'calendarSlot_' + r + '_' + c;            
    var oSlotLabel = app.createLabel()
    .setId(sControl);      

    if(r==0){
      vCaledarSelectors[c] = [];
    };

    vCaledarSelectors[c].push(oSlotLabel); // STORE THE CONTROL POINTER IN ARRAY                
    oCalendar.setWidget(r, c, oSlotLabel);      
  };
};  

for(var vSlotCol in vCaledarSelectors){

  // HIDE ALL CONTROLS IN THE COLUMN
  var chandlerColVisOff = app.createClientHandler().forTargets(vCaledarSelectors[vSlotCol]).setVisible(false);      
  for(var vSlot in vCaledarSelectors[vSlotCol]){
    // UNHIDE THE EVENT SOURCE CONTROL
    var chandlerSlotVisOn = app.createClientHandler().forEventSource().setVisible(true);

    vCaledarSelectors[vSlotCol][vSlot].addClickHandler(chandlerColVisOff).addClickHandler(chandlerSlotVisOn);
  };
};

1 个答案:

答案 0 :(得分:0)

将数组存储为字符串(并将其作为数组检索)可以使用不同的方法实现,其中之一是使用JSON.Stringify(array)JSON.parse(string)方法记录here

但在许多情况下(简单数组),您只需使用逗号作为默认分隔符的join()split()。或者,如果由于某种原因,数组元素中可以有逗号,则自己选择分隔符;我使用了|等不常见的字符,这些字符在视觉上易于阅读,但您可以在join('delimiter')split('delimiter')中使用您想要的内容。

示例:

[a,b,c].join('|') is a string : "a|b|c"

"a|b|c".split('|') is an array : [a,b,c]