我正在编写一个应用程序,将列从一个工作表导入另一个工作表。 .getLastRow方法仅适用于整个工作表,但不能用于获取列的最后一行。有一个问题是打开请求此功能。
我在谷歌脚本的例子中借助2D数组库编写了一些内容:https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library
我已经找到了一个可以找到特定列中最后一行的工作版本,但我怀疑它是相当无效的。
function readRows() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var numRows = sheet.getLastRow();
var numColumns = sheet.getLastColumn();
var data = sheet.getRange(1, 1, numRows, numColumns).getValues();
//Get the Headers, Search for a value of the headers and index
var headerArray = sheet.getRange(1, 1, 1, numColumns).getValues();
var flip = ArrayLib.transpose(headerArray)
var search = "Greens";
var whereGreen = ArrayLib.indexOf(flip, 0, search);
//Get the value of the column with matching headers, and looks up Column length.
var values = sheet.getRange(1, whereGreen +1, numRows, 1).getValues();
//finds last value, makes string
for(; values[numRows - 1] == "" && numRows > 0; numRows--) {}
var lastValue = values[numRows - 1].toString();
//Indexes where the string is, which gives the value -1 of the last row in column.
var lastRowCol = ArrayLib.indexOf(values, 0, lastValue);
Logger.log(lastRowCol +1);
}
任何人都可以帮助我获得精简版本吗?我确信JavaScript可以做到,但我对那个部门的知识很清楚。
答案 0 :(得分:1)
就效率而言,在我看来,这与你提高效率一样接近。就更清洁的解决方案而言,我现在似乎无法想到一个。如果我想到任何事情,我会更新。
答案 1 :(得分:1)
通过减少对电子表格服务的调用次数,可以提高代码效率。以下代码更快:
function readRows() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var data = sheet.getDataRange().getValues();
var numRows = data.length;
//Get the Headers, Search for a value of the headers and index
var headerRow = data[0];
var search = "Greens";
var whereGreen = headerRow.indexOf(search);
//finds last value, makes string
while( data[numRows - 1][whereGreen] == "" && numRows > 0 ) {
numRows--;
}
var lastValue = data[numRows - 1][whereGreen].toString();
Logger.log( 'Last row: '+ numRows );
Logger.log( 'Last value: '+ lastValue );
// Not clear what this does, what more information is needed?
//Indexes where the string is, which gives the value -1 of the last row in column.
//var lastRowCol = ArrayLib.indexOf(values, 0, lastValue);
// Logger.log(lastRowCol +1);
}
我用while循环替换了for循环,但这不会对效率产生太大影响,使其更具可读性。