For loop 如何使用for循环在现有二维阵列的末尾多次添加二维阵列?

For loop 如何使用for循环在现有二维阵列的末尾多次添加二维阵列?,for-loop,multidimensional-array,google-apps-script,google-sheets,For Loop,Multidimensional Array,Google Apps Script,Google Sheets,起点(边界条件): function recurringWeeks() { var ss = SpreadsheetApp.getActiveSheet(); // selects the active spreadsheet var repeatingWeeks = ss.getRange(5,1).getValue(); // gets how many weeks it should repeat var regWeek = ss.getRange(9, 2, 3, 7).ge

起点(边界条件):

function recurringWeeks() {
  var ss = SpreadsheetApp.getActiveSheet(); // selects the active spreadsheet
  var repeatingWeeks = ss.getRange(5,1).getValue(); // gets how many weeks it should repeat
  var regWeek = ss.getRange(9, 2, 3, 7).getValues(); // gets the regular week data
  var regWeekRepeated = ss.getRange(9, 2, repeatingWeeks*3, 7); // create an array to store the events for all weeks

  // fill regWeekRepeated with regWeek
  for (var j = 0; j < repeatingWeeks; j++){
    for (var i = 0; i < 3; i++){
      regWeekRepeated[i+j*3] = regWeek[i];
  }
  }  

  // Repeat week for "A5" times and add to start/end date a week
  for (var j = 0; j < repeatingWeeks; j++){
    for (var i = 0; i < 3; i++){
    regWeekRepeated[i+j*3][0] = new Date(regWeek[i][0].getTime() + j*7*3600000*24); // <-This line leads to an error message.
    }
  }

  ss.getRange(ss.getLastRow()+1,2,repeatingWeeks*3,7).setValues(regWeekRepeated); // copies weekly events after the last row
}
  • 每周都有一组重复事件(每周事件部分
    第9:11行
  • 我的同事可以设置开始日期
    A6
    以及他们希望添加的
    A5
    周数。 开始情况:
目标:
运行脚本时,应在“即将到来的事件”部分(
第22行及之后的
)中添加从日期开始的
A6
周数,并使用正确的日期。 以下是脚本成功运行后的情况:

到目前为止有效的方法:
该脚本能够以正确的顺序将持续一周的重复事件添加到即将到来的事件部分。如果开始日期在一周中,它也可以工作。(此处未显示,因为它可能不相关。)

我的代码:

function recurringWeeks() {
  var ss = SpreadsheetApp.getActiveSheet(); // selects the active spreadsheet
  var repeatingWeeks = ss.getRange(5,1).getValue(); // gets how many weeks it should repeat
  var regWeek = ss.getRange(9, 2, 3, 7).getValues(); // gets the regular week data
  var regWeekRepeated = ss.getRange(9, 2, repeatingWeeks*3, 7); // create an array to store the events for all weeks

  // fill regWeekRepeated with regWeek
  for (var j = 0; j < repeatingWeeks; j++){
    for (var i = 0; i < 3; i++){
      regWeekRepeated[i+j*3] = regWeek[i];
  }
  }  

  // Repeat week for "A5" times and add to start/end date a week
  for (var j = 0; j < repeatingWeeks; j++){
    for (var i = 0; i < 3; i++){
    regWeekRepeated[i+j*3][0] = new Date(regWeek[i][0].getTime() + j*7*3600000*24); // <-This line leads to an error message.
    }
  }

  ss.getRange(ss.getLastRow()+1,2,repeatingWeeks*3,7).setValues(regWeekRepeated); // copies weekly events after the last row
}
更新V02

  // Repeat week for "A5" times and add to start/end date a week
  for (var j = 0; j < repeatingWeeks; j++){
    for (var i = 0; i < 3; i++){
    regWeekRepeated[i+j*3][0] = new Date(regWeek[i][0].getTime() + j*7*3600000*24); //adds a week to the dates for each cycle
    //Logger.log(regWeekRepeated[i]); // log is as expected and desired
    }
    Logger.log(regWeekRepeated); // second part of log not as expected.
  }
  //Logger.log(regWeekRepeated);
  ss.getRange(ss.getLastRow()+1,2,repeatingWeeks*3,7).setValues(regWeekRepeated); // copies weekly events after the last row

regWeekRepeated
不是数组
getRange()
不返回数组

试着从

var regWeekRepeated = ss.getRange(9, 2, repeatingWeeks*3, 7); // create an array to store the events for all weeks

在不接触电子表格的情况下创建数组将提高性能

var regWeekRepeated =[];

为电子表格编写脚本可能会被欺骗,因为电子表格和JavaScript行话/词汇以不同的方式使用相同的术语。也许这就是这里正在发生的事情

  • 错误1:为什么不能将数组
    regWeek
    中的元素值分配给数组
    regWeekRepeated
regWeekRepeated是一个范围对象,而不是JavaScript数组

  • 错误2:此属性问题与错误1有关还是与其他问题有关?我试图分别解决这两个错误
是的,这是相关的。参见前面的答案

  • 在这种情况下,哪种方法(逻辑上或性能上)更有意义:将单个行推送到现有阵列的末尾,还是将整个星期用作阵列构建块
我们可以说调用GoogleApps脚本类和方法是“昂贵的”,所以我们应该尽量减少调用此类元素的次数。一种方法是将范围值传递给JavaScript数组,然后直接对其进行所有更改,最后将结果值传递给相应的范围


要将某个范围的值传递给JavaScript 2D数组,请使用range.getValues()并将JavaScript 2D数组值传递给range use range.setValues()。

按建议获取值将创建一个数组,但在重复事件行之后不包含有意义的数据。这意味着从
var regWeekRepeated=[]开始并用regWeek值填充它可能更好。这是正确的吗?我已经在问题末尾的更新V01下添加了我的建议。我尝试了
var regWeekRepeated=[]和错误消息都消失了。美好的(必须做一个小改动。我在代码下面添加了一条注释。)我将发布代码的当前输出。第二个
for loop
对表现出意外的行为(
重复“A5”次的一周,并将开始/结束日期增加一周)。仅供参考:调整后的代码和输出将发布在更新V02下的问题末尾。我的
for循环逻辑中似乎有一个缺陷。太棒了!我也对它进行了测试,它完全按照预期工作。总结:复制数组有多种方法。根据选择的阵列,更改阵列可能会影响副本。我将从你发布的链接中消化信息,并尝试使用它们。我会用你的答案更新我的问题。再次感谢。我想你的意思是regWeekRepeated是一个范围对象,而不是JavaScript数组。我根据@I'-'I的反馈修改了代码,并创建了一个数组,其中
var regWeekRepeated=[]。错误1由此解决。关于性能问题:我学到了应该尽量减少调用GoogleApps脚本类/方法的次数。我的问题的焦点是:单独添加每一行还是批量添加重复事件,性能方面更好?(或者差异相对较小,可以忽略不计?)关于第一部分,你是对的,我修正了这一点。
var regWeekRepeated = ss.getRange(9, 2, repeatingWeeks*3, 7).getValues(); // create an array to store the events for all weeks
var regWeekRepeated =[];