循环时出现“目标范围的坐标超出图纸尺寸”的错误

时间:2018-12-29 11:04:49

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

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

所以我在Google表格中得到了这段代码:

  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循环内的所有错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我还没有测试过,但是尝试一下:

我认为filter的问题在于它也会在结束之前删除空格,但是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是该工作表。所以我重写了范围参数。对不起,如果这不起作用。