【问题标题】:The coordinates of the target range are outside the dimensions when using getValue within loop在循环中使用 getValue 时,目标范围的坐标在尺寸之外
【发布时间】:2020-06-19 23:04:42
【问题描述】:

我有一个手动运行的 google sheet app 脚本。执行 clearForecast() 函数时,我收到以下异常:

例外:目标范围的坐标超出 片材的尺寸。 (第 30 行,文件“代码”)

sh = SpreadsheetApp.getActiveSpreadsheet();

function clearForecast(){
  moveProjectionActions();
  // sh.getRange("forecast!A2:D").clearContent();

}

function moveProjectionActions() {
  var locSheets = ["clt","chi","kan","mil","nnj","nva","nyc","sfl","uny"];

  for (var i = 0; i < locSheets.length; i++) {
    friendlyName = locSheets[i];

    // the numComments line below is line 30.
    numComments = sh.getSheetByName(friendlyName).getRange("Y13").getValue();

    if (numComments > 0) {
      locValues = sh.getSheetByName(friendlyName).getRange('U6:Y12').getValues();

      shFrom = friendlyName + "!U6:Y12";
      var source = sh.getRange(shFrom);
      var destSheet = sh.getSheetByName("forecast_log");

      var destRange = destSheet.getRange(destSheet.getLastRow()+1,1);
      source.copyTo (destRange, {contentsOnly: true});

      sh.getSheetByName(friendlyName).getRange('X6:Y12').clearContent();
    }  
  }
}

Y13单元格中的公式为:

=counta(X6:X12)

只有当数字大于 0 时才会发生此异常。如果是 0,或文本,则一切正常。

奇怪的是,我又做了一个函数:

function testFunc() {
  num_comments = sh.getSheetByName("clt").getRange("Y13").getValue();
}

执行此操作时,也不例外。我已经花了好几个小时试图弄清楚这一点,非常感谢任何帮助。

【问题讨论】:

  • 正确。或关闭。我在目标单元格的右侧有一个公式。非常感谢!
  • 您的问题解决了吗?如果是这种情况,并且解决方案不是我的答案,您会考虑发布答案吗?

标签: exception google-apps-script google-sheets


【解决方案1】:

试试:

function testFunc() {
  var locSheets = ["clt","chi","kan","mil","nnj","nva","nyc","sfl","uny"];
  for (var i = 0; i < locSheets.length; i++) {
    try {
    var numComments = sh.getSheetByName(locSheets[i]).getRange("Y13").getValue();
    }
    catch(e) {
      console.log(locSheets[i] + ', ' + locSheets[i].getMaxRows() + ', ' +  locSheets[i].getMaxColumns());
    }

}

【讨论】:

    【解决方案2】:

    问题:

    您正在尝试将源范围复制到不存在的目标范围。

    说明:

    让我们看看错误是怎么说的:

    目标范围的坐标在工作表的尺寸之外。

    在这种情况下,目标范围是指destRange,您希望通过copyTosource 复制到该范围。错误说,这个目标范围超出了目标工作表的尺寸。那么,让我们看看目标范围是如何定义的:

    destRange = destSheet.getRange(destSheet.getLastRow()+1,1);
    

    这里,目标范围定义为最后一行内容后第一行的第一个单元格(destSheet.getLastRow() + 1)。您在此处遇到错误的事实意味着包含内容的最后一行 (destSheet.getLastRow()) 也是工作表中的最后一行(包含内容的最后一行之后没有空行)。

    解决方案:

    在复制范围之前,在目标工作表中插入一个空白行,以确保工作表末尾有一个空行。例如,您可以在copyTo 之前使用insertRowAfter

    destSheet.insertRowAfter(destSheet.getLastRow());
    source.copyTo(destRange, {contentsOnly: true});
    

    注意:

    • 如果Y13 不是正数,则不会发生异常,因为代码从未进入if 块:if (numComments &gt; 0) { ... }

    【讨论】:

      【解决方案3】:

      异常是我试图写入的范围内右侧大多数单元格中存在公式的结果。

      删除后,它按预期工作。

      【讨论】:

      • 不确定我是否了解公式如何导致此错误。此错误基本上意味着您要复制到的目标范围不完全存在(它的某些行或列不存在)。你能详细说明一下吗?
      • 当然。目标工作表的结构是用脚本中的数据填充左侧大多数单元格。右侧的大多数单元格包含将左侧两个单元格中的数据组合起来的公式。正在更新行中包含数据的任何单元格都会导致错误。我希望这是有道理的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多