google-apps-script - 特定行中的最后一列出现错误“目标范围的坐标超出了工作表的尺寸”。
问题描述
正如标题所说,我想获得特定行中的最后一列。我尝试了与我的功能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()
。
解决方案
这是一个获取最后一列是所有行的函数。
此函数生成数据:
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;
}
推荐阅读
- javascript - Electron + Vue API 请求落到 app://
- xslt - 在 XSLT 中用零右填充字符串
- redis - Redis 中 LTRIM 命令的时间复杂度是多少?
- javascript - 未捕获的 ReferenceError:Laravel 8 中未定义路由
- python - 为什么我不能修补 multiprocessing.Process?
- c++ - C++ & Lua 在运行时注册自定义 lua 库
- simulation - Anylogic - 如何在模拟中测量在制品库存 (WIP)
- shopify - 下载 Shopify 本地开发的主题
- amazon-web-services - 如何避免 S3 存储桶策略冲突
- javascript - 如何使用(React Native)每秒更改背景颜色