繁体   English   中英

Google脚本GetRange乘而不是添加?

[英]Google-Script GetRange Multiplying instead of Adding?

我有一个代码,应该输入一个日历事件,然后在单元格中插入一个注释,说“已输入”。 这部分起作用,但仅在一定程度上起作用。

如果我有多个事件(在单独的行上),则在第一个事件上我会说“ Input”。 但是对于其他人,它然后在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})

关于使用for..in循环for..in数组,有记录的警告,例如,请参阅MDN上的此说明

您看到的问题是由for..in工作方式引起的。

示范代码

此测试功能将演示在i + startRow行上的.setComment()时发生了什么:

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类型-因此,对于+运算符,您将获得字符串行为。 当执行i + startRowstartRow被强制为一个字符串,然后被连接为i ,而i已经是一个字符串。

另一方面,在for循环中,相同的语句会导致数学运算,因为两个操作数均为数字类型。

不要在数组操作中使用for..in

简短,它经常有效,但是会破坏习惯。

使用此代替:

for (var i = 0; i < data.length ; i++) {
  ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM