谷歌脚本GetRange倍增而不是添加?

时间:2013-06-01 14:21:00

标签: javascript google-apps-script google-sheets google-calendar-api

我有一个代码应该输入一个日历事件,然后在单元格中输入一个注释“Inputted”。这部分有效,但只是在一定程度上。

如果我有多个事件(在不同的行上),它会在第一个事件上说出“输入”。但是对于其他人来说,它会创建一个10行而不是1行的注释。查看我的代码,我看不到任何会导致它执行此操作的内容 - 因为日历事件是完美创建的。我相信它位于var Comment部分 - 但那里没有乘法!

谁能看到我哪里出错?!

  function CalendarInput() {

      var sheet = SpreadsheetApp.getActiveSheet();

       var startRow = 2;  // First row of data to process
      var numRows = 3;   // Number of rows to process
      var dataRange = sheet.getRange(startRow, 1, numRows, 26); //What data will be used
      var data = dataRange.getValues();
      var cal = CalendarApp.getDefaultCalendar(); //Gets the correct calendar
    for (i in data) {
      var row = data[i];
      var title = row[2];  // Column with Title
      var desc = row[8];       // Column with Description
      var date = row[3];   //Column with Date
      var edate = row[4] //Column with end date
      var loc = row[9];    //Column with Location
      var invite = row[11] //Column with Invite List
      var sent = row[12] //Check Sent
      var check = row[7]
      var Comment = sheet.getRange(i+startRow, 7).setNote("Inputted")


              cal.createAllDayEventSeries(title, new Date(date), CalendarApp.newRecurrence().addDailyRule().until(new Date(edate)), {description:desc,location:loc,guests:invite})

1 个答案:

答案 0 :(得分:0)

有关使用for..in循环遍历数组的文档警告,例如,请参阅this Description on MDN

您看到的问题是由for..in在应用脚本中的工作方式引起的。

演示代码

此测试功能将演示.setComment()i + startRow时发生的情况:

function test() {
  var data = [ [2,3,4,5],[5,4,3,2],[6,7,8,9],[9,8,7,6] ];
  var startRow = 2;
  var i;

  Logger.log("for (var i in data)");
  for (i in data) {
    Logger.log( i + startRow );
  }
  Logger.log(typeof i);

  Logger.log("for (var i = 0; i < data.length ; i++)");
  for (i = 0; i < data.length ; i++) {
    Logger.log( i + startRow );
  }
  Logger.log(typeof i);
}

记录输出

[13-06-01 22:41:10:046 EDT] for (var i in data)
[13-06-01 22:41:10:046 EDT] 02
[13-06-01 22:41:10:046 EDT] 12
[13-06-01 22:41:10:046 EDT] 22
[13-06-01 22:41:10:046 EDT] 32
[13-06-01 22:41:10:047 EDT] string

[13-06-01 22:41:10:047 EDT] for (var i = 0; i < data.length ; i++)
[13-06-01 22:41:10:047 EDT] 2.0
[13-06-01 22:41:10:047 EDT] 3.0
[13-06-01 22:41:10:047 EDT] 4.0
[13-06-01 22:41:10:047 EDT] 5.0
[13-06-01 22:41:10:047 EDT] number

发生了什么事??

当使用for..in循环时,循环变量i是一个字符串 - 循环变量i的类型为String - 因此您可以获得像{{{}这样的运算符的字符串行为1}}。执行+时,i + startRow被强制转换为字符串,然后连接到startRow,这已经是一个字符串。

另一方面,在i循环中,同一语句导致数学运算,因为两个操作数都是数字类型。

不要将for..in用于数组操作

它很短,通常有效,但打破习惯。

请改用:

for