使用字符串或整数在Google工作表中查找单元格的位置

时间:2014-08-29 08:37:48

标签: google-apps-script google-sheets

这个问题看起来很简单,但我一直在寻找/尝试几个小时来寻找解决方案。我基本上有一个大型电子表格(3万行ISBN' s),每个都有相应的作者,标题,流派等。

我的计划是创建一个允许我简单地生成一个小UI的函数,它接收一个Isbn和一个金额,有一个提交按钮(全部完成),然后找到该ISBN并增加该行中的值。最大的绊脚石是能够使用已存储为变量并在表中找到匹配的isbn,因为我根本找不到某种类型的" getValue()"谷歌表中的功能。

我已经看过几个人将他们的整个数据加载到一个数组并将所需的值与每个单独的条目进行比较的例子,但这对我来说似乎是非常低效和慢的?当然,必须有一种简单,有效的方式,我只是忽略。我所追求的只是一种搜索值的简单方法,在工作表中找到该值并返回该行。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您认为必须有更有效的方式来查找电子表格中的项目是不正确的。电子表格服务中没有“查找”方法,但是数组迭代速度快,批量数据读取速度也非常快,因此即使对于很长的列表,也不应该对速度参数感到恼火。

以下是2个代码片段,用于查找第1列中字符串的行号。

在第一个中,我转换了数组,以便我可以在一个简单的数组中搜索单个列。

两者都以毫秒为单位显示时间。

function testISBN1(){
  var time = new Date().getTime();
  var isbn = 'test1990'; // just as a test... create your own Ui to enter the value to search for
  Logger.log(findISBN(isbn)+'  in '+(new Date().getTime()-time)+' mSec');// view result... false if no occurrence (do something with that value)
}

function findISBN(isbn){
  var sh = SpreadsheetApp.getActive().getSheetByName('Sheet1');// select your sheet
  var data = sh.getDataRange().getValues(); // get all data at once
  var isbnColumn = transpose(data)[0];// if isbn is column 1 (it became row1 because of transpose
  for(var n in isbnColumn){
    if(isbnColumn[n] == isbn){ n++ ; return n }; // if found, increment to get the sheet row number
  }
  return false;// not found
}


function transpose(a) { // classical Array transpose JS function
  return Object.keys(a[0]).map(
    function (c) { return a.map(function (r) { return r[c]; }); }
  )
}

第二个,没有转置需要大约相同的时间来执行(在2000行表中大约230 mS)

function testISBN2(){
  var time = new Date().getTime();
  var isbn = 'test1990'; // just as a test... create your own Ui to enter the value to search for
  Logger.log(findISBN2(isbn)+'  in '+(new Date().getTime()-time)+' mSec');// view result... false if no occurrence (do something with that value)
}

function findISBN2(isbn){
  var sh = SpreadsheetApp.getActive().getSheetByName('Sheet1');// select your sheet
  var data = sh.getDataRange().getValues(); // get all data at once
  for(var n in data){
    if(data[n][0] == isbn){ n++ ; return n }; // if found (in column 1), increment to get the sheet row number
  }
  return false;// not found
}

下面是执行记录,显示每行代码所花费的时间。如您所见,总执行时间主要用于获取工作表并获取其值。

enter image description here