首页 > 解决方案 > 特定行中的最后一列出现错误“目标范围的坐标超出了工作表的尺寸”。

问题描述

正如标题所说,我想获得特定行中的最后一列。我尝试了与我的功能lastColumnForRow(sheet, row)非常相似的功能lastRowForColumn(sheet, column)。但是,我收到错误,getLastColumn()并且lastColumnForRow(sheet, row)正在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()

标签: google-apps-scriptgoogle-sheets

解决方案


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

此函数生成数据:

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;
}

推荐阅读