Google apps script Google应用程序脚本查找行的最快方法?
我正在尝试找出从值与我的查询匹配的行中获取数据的最快方法,我目前使用以下代码:Google apps script Google应用程序脚本查找行的最快方法?,google-apps-script,Google Apps Script,我正在尝试找出从值与我的查询匹配的行中获取数据的最快方法,我目前使用以下代码: var spr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CustomerList'); var klantNummer = array1[0].toString(); var emailgebruiker = Session.getActiveUser().getEmail(); var data = spr.getDa
var spr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CustomerList');
var klantNummer = array1[0].toString();
var emailgebruiker = Session.getActiveUser().getEmail();
var data = spr.getDataRange().getValues();
for(n=0;n<data.length;++n){
if(data[n][0].toString() == klantNummer){ //.match(klantNummer)
data[n][21] = emailgebruiker
var KlantNR = data[n][0];
var Email = data[n][3];
var Stad = data[n][12];
var Taalschool = firstToUpperCase( data[n][13].toString() );
var Cursus = firstToUpperCase( data[n][14].toString() );
var Weken = data[n][15];
var Accommodatie1 = data[n][17];
var TypeAccommodatie = data[n][18];
var TypeKamer = data[n][19];
var VertrekDatum1 = data[n][20];
};
}
spr.getRange(1,1,data.length,data[0].length).setValues(data);
var spr=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CustomerList');
var klantNummer=array1[0].toString();
var emailgebruiker=Session.getActiveUser().getEmail();
var data=spr.getDataRange().getValues();
对于(n=0;n有一个快速的解决方案,可以解决某些情况。您可以在找到匹配项后中断循环。但是,如果您的数据位于列表的底部,这将没有帮助
if(data[n][0].toString() == klantNummer){ //.match(klantNummer)
data[n][21] = emailgebruiker;
var KlantNR = data[n][0];
var Email = data[n][3];
.
.
.
var VertrekDatum1 = data[n][20];
break;
}
第二种加速搜索的方法是按搜索键(klantNummer)对数据排序,然后执行二进制搜索。在不知道数据集的情况下,这可能不会更快,因为您首先需要对数据集进行排序,然后才能进行搜索。
您可以通过使用一张按客户编号预先排序的重复客户表来解决此问题。这将是您用于搜索的表
这是javascript中的二进制搜索。它来自。我将其修改为使用多维数组作为getValues()返回它们的方式。搜索索引中客户编号所在列的最后一个参数。下面的代码在2000条记录的数据集中大约.139秒内返回了行号
function myFunction() {
var customerId = 11359;
var ss = SpreadsheetApp.getActiveSheet();
var range = ss.getDataRange();
var customers = range.getValues();
var index = binarySearch(customers, customerId,0);
Logger.log(index+1); // This is the Row in the spreadsheet.
}
/**
* Performs a binary search on the provided sorted list and returns the index of the item if found. If it can't be found it'll return -1.
*
* @param {*[][]} list Items to search through.
* @param {*} item The item to look for.
* @return {Number} The index of the item if found, -1 if not.
*/
function binarySearch(list, item,column) {
var min = 0;
var max = list.length - 1;
var guess;
var column = column || 0
while (min <= max) {
guess = Math.floor((min + max) / 2);
if (list[guess][column] === item) {
return guess;
}
else {
if (list[guess][column] < item) {
min = guess + 1;
}
else {
max = guess - 1;
}
}
}
return -1;
}
函数myFunction(){
var customerId=11359;
var ss=SpreadsheetApp.getActiveSheet();
var range=ss.getDataRange();
var customers=range.getValues();
var index=binarySearch(客户,customerId,0);
Logger.log(index+1);//这是电子表格中的行。
}
/**
*对提供的排序列表执行二进制搜索,如果找到,则返回该项的索引。如果找不到,则返回-1。
*
*@param{*[]}列出要搜索的项目。
*@param{*}item要查找的项。
*@return{Number}如果找到该项,则返回该项的索引,-1。
*/
函数二进制搜索(列表、项、列){
var min=0;
var max=list.length-1;
var猜测;
变量列=列| | 0
虽然(min有一个快速解决方案可以解决某些情况。您可以在找到匹配项后中断循环。但是,如果您的数据位于列表的底部,则这不会有帮助
if(data[n][0].toString() == klantNummer){ //.match(klantNummer)
data[n][21] = emailgebruiker;
var KlantNR = data[n][0];
var Email = data[n][3];
.
.
.
var VertrekDatum1 = data[n][20];
break;
}
第二种加速搜索的方法是按搜索键(klantNummer)对数据排序,然后执行二进制搜索。在不知道数据集的情况下,这可能不会更快,因为您首先需要对数据集进行排序,然后才能进行搜索。
您可以通过使用一张按客户编号预先排序的重复客户表来解决此问题。这将是您用于搜索的表
这是javascript中的二进制搜索。它来自。我将其修改为使用多维数组作为getValues()返回它们的方式。搜索索引中客户编号所在列的最后一个参数。下面的代码在2000条记录的数据集中大约.139秒内返回了行号
function myFunction() {
var customerId = 11359;
var ss = SpreadsheetApp.getActiveSheet();
var range = ss.getDataRange();
var customers = range.getValues();
var index = binarySearch(customers, customerId,0);
Logger.log(index+1); // This is the Row in the spreadsheet.
}
/**
* Performs a binary search on the provided sorted list and returns the index of the item if found. If it can't be found it'll return -1.
*
* @param {*[][]} list Items to search through.
* @param {*} item The item to look for.
* @return {Number} The index of the item if found, -1 if not.
*/
function binarySearch(list, item,column) {
var min = 0;
var max = list.length - 1;
var guess;
var column = column || 0
while (min <= max) {
guess = Math.floor((min + max) / 2);
if (list[guess][column] === item) {
return guess;
}
else {
if (list[guess][column] < item) {
min = guess + 1;
}
else {
max = guess - 1;
}
}
}
return -1;
}
函数myFunction(){
var customerId=11359;
var ss=SpreadsheetApp.getActiveSheet();
var range=ss.getDataRange();
var customers=range.getValues();
var index=binarySearch(客户,customerId,0);
Logger.log(index+1);//这是电子表格中的行。
}
/**
*对提供的排序列表执行二进制搜索,如果找到,则返回该项的索引。如果找不到,则返回-1。
*
*@param{*[]}列出要搜索的项目。
*@param{*}item要查找的项。
*@return{Number}如果找到该项,则返回该项的索引,-1。
*/
函数二进制搜索(列表、项、列){
var min=0;
var max=list.length-1;
var猜测;
变量列=列| | 0
虽然(min我发现驱动器中保存为文本文件的JSON对象运行速度非常快,但在不到200毫秒的时间内读取并解析6mb的文本文件。这样,您可以将klantNummer
的所有行保存到对象并调用它,在1秒内获取行并获取所有值,例如:
保存、更新并获取klantNummer
示例:
function saveFile(){
var klanNumbers = {'ben@gmail.com ': 3, 'dora@gmail.com' : 12, 'ksd@gmail.com' : 33};
return DriveApp.createFile('klanNumbers', JSON.stringify(klanNumbers));
}
function updateFile( newKlanNumb, klanLine ){
var klanNumbFile = DriveApp.getFilesByName('klanNumbers').next(),
file = JSON.parse(file.getAs("application/none").getDataAsString());
if( file[ newKlanNumb ] )
file[ newKlanNumb ] = file[ newKlanNumb ] + ',' + klanLine;
else
file[ newKlanNumb ] = klanLine;
klanNumbFile.setTrashed(true);
return DriveApp.createFile('klanNumbers', JSON.stringify( newKlanNumb ));
}
function getKlanNumbers( klanNumb ){
var file = DriveApp.getFilesByName('Transactions').next(),
info = file.getAs("application/none").getDataAsString(),
klanNumbers = JSON.parse(info);
return klanNumbers[klanNumb];
}
我发现,在驱动器中保存为文本文件的JSON对象运行速度非常快,一个6mb的文本文件在200毫秒内被读取然后被解析。这样,您可以将klantNummer
的所有行保存到该对象并调用它,在1秒内获取行并获取所有值,例如:
保存、更新并获取klantNummer
示例:
function saveFile(){
var klanNumbers = {'ben@gmail.com ': 3, 'dora@gmail.com' : 12, 'ksd@gmail.com' : 33};
return DriveApp.createFile('klanNumbers', JSON.stringify(klanNumbers));
}
function updateFile( newKlanNumb, klanLine ){
var klanNumbFile = DriveApp.getFilesByName('klanNumbers').next(),
file = JSON.parse(file.getAs("application/none").getDataAsString());
if( file[ newKlanNumb ] )
file[ newKlanNumb ] = file[ newKlanNumb ] + ',' + klanLine;
else
file[ newKlanNumb ] = klanLine;
klanNumbFile.setTrashed(true);
return DriveApp.createFile('klanNumbers', JSON.stringify( newKlanNumb ));
}
function getKlanNumbers( klanNumb ){
var file = DriveApp.getFilesByName('Transactions').next(),
info = file.getAs("application/none").getDataAsString(),
klanNumbers = JSON.parse(info);
return klanNumbers[klanNumb];
}
那个二进制搜索太快了!谢谢!!但是我怎么能从那个搜索中得到结果行呢?检查更新的代码。从代码中返回的索引+1就是行号。那个二进制搜索太快了!谢谢!!但是我怎么能从那个搜索中得到结果行呢?检查更新的代码。从代码中返回的索引+1就是行号。这就是令人印象深刻!我要试试这个。[15-03-30 15:48:05:215 CEST]DriveApp.getFilesByName([klanNumbers])[0秒][15-03-30 15:48:05:348 CEST](类)。next()[0.132秒][15-03-30 15:48:05:349 CEST]File.getAs([application/none])[0秒][15-03-30 15:48:05:478 CEST]Blob.getDataAsString()[0.129秒][15-03-30 15:48:05:509 CEST]Browser.msgBox([undefined])[0秒]
是我从日志“Klantnumers”start@100001中得到的,这就是这里出错的地方。100001=KlanNumbers[1]。我知道我可以用“”替换10000因此,我有1,但当我在100010时,出现了问题。我如何解决这个问题?执行时间太棒了!这就像一个数组,需要一个循环来找到所需的值,数组的表示法是[value1,value2]
,其中每个值都以下一个可用的数值作为索引。在一个对象中,表示法是{index:value,index2,value2}
,在其中指定值键(或索引),这样您就不必通过数组进行搜索,只需指向所需的位置,这就是为什么使用对象更快的原因,您必须重构