更有效的方法是查找特定列中的最后一行?

时间:2013-02-11 18:54:31

标签: google-apps-script

我正在编写一个应用程序,将列从一个工作表导入另一个工作表。 .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可以做到,但我对那个部门的知识很清楚。

2 个答案:

答案 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循环,但这不会对效率产生太大影响,使其更具可读性。