0

我正在编写一个应用程序,将列从一张表导入到另一张表。.getLastRow 方法仅适用于整个工作表,但不能用于获取列的最后一行。存在一个请求此功能的问题。

我在谷歌脚本示例中的 2D Array 库的帮助下写了一些东西: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 可以做到这一点,但我对我在该部门的知识相当了解。

4

2 回答 2

2

通过减少对电子表格服务的调用次数,可以提高代码的效率。下面的代码要快得多:

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

于 2013-02-12T20:13:45.907 回答
1

在我看来,就效率而言,这与您的效率差不多。就更清洁的解决方案而言,我现在似乎想不出一个。如果我想到什么会更新。

于 2013-02-11T20:16:26.477 回答