【问题标题】:"The coordinates of the target range are outside the dimensions of the sheet" error when looping循环时出现“目标范围的坐标超出工作表的尺寸”错误
【发布时间】:2018-12-29 11:04:49
【问题描述】:

我有 4 张纸。表格、原始、URL 和美国/日本/加拿大。我从 URL 表中获取电子表格 url 值,并在 Raw 表中使用“IMPORTRANGE”来传输数据表。从那里,我遍历原始表中的表以检查值是否与表单表中的值匹配。如果匹配,我将在美国/日本/加拿大表中转移该行。

所以我在我的谷歌表格中得到了这个代码:

  var mainWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form');
  var continentWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('USA/Japan/Canada');
  var rawWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Raw');
  var urlWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('URLs');

  var tourName = mainWS.getRange('C4').getValue();
  var depDate = new Date(mainWS.getRange('C5').getValue());
  var status = mainWS.getRange('C6').getValue();

  //extract table data
  var url =  urlWS.getRange("B4").getValue();
  rawWS.getRange('A1').setValue('=IMPORTRANGE("' + url + '","Main Data!A1:AE")');

  var dummyHolder = rawWS.getRange("B1:B").getValues();
  var lastRow = dummyHolder.filter(String).length;

  Logger.log(lastRow);

  //loop through the raw extract
  for(var i = 2; i <= lastRow; i++){

    var dateHolder = new Date(rawWS.getRange("E" + i).getValue());

    if(rawWS.getRange("F" + i).getValue() == tourName && rawWS.getRange("I" + i).getValue() == status && dateHolder.getTime() === depDate.getTime()){
      var continentLR = continentWS.getLastRow() + 1; 
      rawWS.getRange('Raw!' + i + ':' + i + '').copyTo(continentWS.getRange(continentLR, 1), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    }

  }

然后,一旦进入循环,我就会突然收到“目标范围的坐标超出工作表的尺寸”错误消息。特别是在for循环之后的第一行:

 var dateHolder = new Date(rawWS.getRange("E" + i).getValue());

需要明确的是,它循环的 rawWS 有 134 条记录,并将 134 注册为其最后一行。我不知道为什么我在这里遇到错误。

当我删除该行时,它仍然在下一行给我一个错误。 for 循环中的所有错误。

有什么想法吗?

【问题讨论】:

  • 试过了,我得到了 E2 直到 E134。
  • 你真的需要阅读this你可能想重写整个事情。
  • 我使用了 Logger.log 并得到了值。因为是约会,所以我得到了“Sun Apr 07 12:00:00 GMT-04:00 2019”。我试图注释掉循环内的整个 IF 块,突然 var dateHolder 代码行运行没有任何错误。但是一旦我包含 IF 块,错误就会继续。
  • 这很奇怪,我使用了 3 个类似的函数。我只是替换了每个函数的范围,除了这个之外它们工作得很好
  • 出错时i的值是多少?目标工作表有多少行?

标签: javascript for-loop google-apps-script google-sheets


【解决方案1】:

我没有测试过,但试试看:

我认为过滤器的问题在于它也会在结束之前删除空白,但 getValues() 不会。因此,根据数据集,您最终可能会得到错误的长度。

function unknown() {
  var formWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form');
  var continentWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('USA/Japan/Canada');
  var rawWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Raw');
  var urlWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('URLs');
  var tourName = formWS.getRange('C4').getValue();
  var depDate = new Date(formWS.getRange('C5').getValue());
  var status = formWS.getRange('C6').getValue();
  //extract table data
  var url =  urlWS.getRange("B4").getValue();
  rawWS.getRange('A1').setValue('=IMPORTRANGE("' + url + '","Main Data!A1:AE")');
  var dummyHolder = rawWS.getRange(1,2,rawWS.getLastRow(),1).getValues();

  for(var i=dummyHolder.length-1;i>=0;i--){
    if(!dummyHolder[i][0]){
      dummyHolder.splice(i,1);
    }else{
      break;
    }
  }
  //loop through the raw extract
  for(var i=2;i<dummyHolder.length; i++){
    var dateHolder = new Date(rawWS.getRange(i,5).getValue());
    if(rawWS.getRange(i,6).getValue() == tourName && rawWS.getRange(i,9).getValue() == status && dateHolder.getTime() === depDate.getTime()){
      var continentLR = continentWS.getLastRow() + 1; 
      rawWS.getRange(i,1,).copyTo(continentWS.getRange(continentLR, 1), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    }

  }
}

您的最后一行还包括范围内的工作表名称,但 rawWS 是该工作表。所以我重写了范围参数。对不起,如果这不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多