【问题标题】:Last column in a specific row with the error "The coordinates of the target range are outside the dimensions of the sheet."特定行中的最后一列出现错误“目标范围的坐标超出了工作表的尺寸”。
【发布时间】:2019-09-05 00:01:14
【问题描述】:

正如标题所说,我想获取特定行中的最后一列。我用我的函数lastColumnForRow(sheet, row) 进行了尝试,这与我的函数lastRowForColumn(sheet, column) 非常相似。但是,lastColumnForRow(sheet, row) 中的 getLastColumn() 出现错误,lastRowForColumn(sheet, column) 正在按预期工作。有人知道更好的方法或如何解决这个问题吗?

在我的工作表中,最后一列中有一个值,因此我添加了一个没有值的新列,但这并没有解决问题。我也试过getLastColumn()-1,但同样的问题。

function lastRowForColumn(sheet, column){
  // Get the last row with data for the whole sheet.

  // Get all data for the given column

  // Iterate backwards and find first non empty cell

}

function lastColumnForRow(sheet, row){
  // Get the last column with data for the whole sheet.
  var numColu = sheet.getLastColumn();

  // Get all data for the given row
  var data2 = sheet.getRange(row, 1, 1, numColu).getValues();

  // Iterate backwards and find first non empty cell
  for(var j = data2.length - 1 ; j >= 0 ; j--){
    if (data[0][j] != null && data[0][j] != ""){
      return j + 1;
    }
  }
}


function Missionen() {
 var gros = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Großaufträge");
  var schab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Schablonen");
  var name = gros.getRange(9, 3).getValue();
  gros.getRange(12, lastColumnForRow(gros, 12)+1).setValue("Auftrag "+name);
}

我试图在一行中获取最大数量的列,然后向后迭代以找到第一个非空单元格。如果我尝试执行代码,总会出现问题

“目标范围的坐标超出了工作表的尺寸。(第 18 行,文件“代码”)”

基于电话getLastColumn()

【问题讨论】:

  • numColu 不是问题。 row 是。 row 的输入值是多少,它是否在工作表的尺寸内?第 18 行是什么?
  • @TheMaster 我在函数Missionen()中使用函数lastColumnForRow(sheet, row)。如您所见,输入是第 12 行(在维度内)。第 18 行是var numColu = sheet.getLastColumn()
  • 我的猜测是,如果您花时间创建minimal reproducible example,您可能会自己找出问题所在。没有minimal reproducible example,我们很难调试问题。但我一直自愿预测@TheMaster 可能是正确的。
  • 第 18 行不是var numColu = sheet.getLastColumn()。请再次检查。您确定 Row12 存在于gros 表中吗?有没有全局变量?
  • @TheMaster 在这里你可以看到这一行:imgur.com/a/B2cZwtk 第 12 行存在并且没有全局变量。我将像 Cooper 所说的那样创建一个最小的可重现示例。

标签: google-apps-script google-sheets


【解决方案1】:

这是一个获取最后一列是所有行的函数。

这个函数生成数据:

function makeSomeData() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  sh.clearContents();
  var rg=sh.getRange(1,1,25,25);
  var vA=rg.getValues();
  var k=0;
  for(var i=0;i<vA.length;i++) {
    for(var j=0;j<vA[0].length-k;j++) {
      vA[i][j]=j+1;
    }
    k++;
  }
  rg.setValues(vA);
}

这个函数计算每一行的长度

function findLastColumnInARow() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rowA=[];
  for(var i=0;i<vA.length;i++) {
    if(vA[i].length>0) {
      var row=removeEmptyCellsAtEndOfArray(vA[i]);
      rowA.push(row.length);
    }
  }
  Logger.log(rowA);
  //[25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0]
}
function removeEmptyCellsAtEndOfArray(arr) {
  if(arr) {
    for(var i=arr.length-1;i>=0;i--) {
      if(arr[i]=='') {
        arr.splice(i,1);
      }else{
        break;
      }
    }
  }
  return arr;
}

我认为你可以这样重写你的函数:

function lastColumnForRow(sheet, row){
  var data=sheet.getRange(row,1,1,sh.getLastColumn()).getValues()[0];
  var rA=removeEmptyCellsAtEndOfArray(data);
  return rA.length;
}

【讨论】:

  • 我也试过函数findLastColumnInARow()和我的函数lastColumnForRow(sheet, row)。由于某种原因,这些不会更新:如果我在最后一列旁边添加一些值,并使用此代码在一行中添加值,然后重做此过程,则始终会更新同一个单元格,而不是它旁边的单元格。 findLastColumnInARow() 函数也只计算数字,它不应该这样做。
  • 没关系,我的代码有错误!现在它按预期工作了:) 非常感谢@all 的帮助!
  • 昨晚我想了更多,我意识到data.filter 不是一个好的选择,因为它只是删除了数组末尾的空值,所以如果你在行的开头附近有空单元格,它们也会被删除。
  • 是的,我现在使用了我的函数,如果我没有像@TheMaster 所说的那样在行中输入,它就不起作用。
  • 如果 row.length==0 则不要调用该函数;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多