我正在尝试在运行时方面找到最佳脚本来完成任务。我有一个相当大的电子表格,我需要检查某些已知列中的值,并根据匹配情况返回该行。理想情况下,我想要一个包含返回行的新电子表格。
我已经通过 ID 打开了电子表格,并且已经获得了工作表和范围,但不确定搜索特定列并不仅获取该值而且获取整行的最有效方法。
我正在尝试在运行时方面找到最佳脚本来完成任务。我有一个相当大的电子表格,我需要检查某些已知列中的值,并根据匹配情况返回该行。理想情况下,我想要一个包含返回行的新电子表格。
我已经通过 ID 打开了电子表格,并且已经获得了工作表和范围,但不确定搜索特定列并不仅获取该值而且获取整行的最有效方法。
您可以使用下面的代码在特定列中进行搜索。代码是不言自明的。
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [ {name: "Search", functionName: "onSearch"} ];
ss.addMenu("Commands", menuEntries);
}
function onSearch()
{
var searchString = "Test11";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SheetName");
var column =4; //column Index
var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
var searchResult = columnValues.findIndex(searchString); //Row Index - 2
if(searchResult != -1)
{
//searchResult + 2 is row index.
SpreadsheetApp.getActiveSpreadsheet().setActiveRange(sheet.getRange(searchResult + 2, 1))
}
}
Array.prototype.findIndex = function(search){
if(search == "") return false;
for (var i=0; i<this.length; i++)
if (this[i] == search) return i;
return -1;
}
您可能想要使用 Google Apps Script textFinder类。
此示例函数将搜索字符串并在警报对话框中显示第一次出现的行:
function searchString(){
var sheet = SpreadsheetApp.getActiveSheet()
var search_string = "dog"
var textFinder = sheet.createTextFinder(search_string)
var search_row = textFinder.findNext().getRow()
var ui = SpreadsheetApp.getUi();
ui.alert("search row: " + search_row)
}
用途:
Lookup_(SheetinfoArray,"Sheet1!A:B",0,[1],"Sheet1!I1","n","y","n");
Lookup_(Sheetinfo,"Sheet1!A:B",0,[1],"return","n","n","y");
Lookup_(SheetinfoArray,"Sheet1!A:B",0,[0,1],"return","n","n","y");
Lookup_(Sheetinfo,"Sheet1!A:B",1,[1,3,0,2],"return","y","n","n");
Lookup_("female","Sheet1!A:G",4,[2],"Database!A1","y","y","y");
Lookup_(Sheetinfo,LocationsArr,4,[0],"return","y","n","y");
Lookup_(/RegEx+/i,LocationsArr,4,[0],"return","y","n","y");
///////////////////////////////////////// /////
参数说明:
-"Search_Key" - 可以是字符串、数组或正则表达式以一次查找多个内容
-“RefSheetRange” - 信息的参考来源。可以是本地工作表引用和范围或来自变量的数据数组。
-“SearchKey_RefMatch_IndexOffSet” - 您将“Search_Key”引用到“RefSheetRange”数据的信息列。
-“IndexOffSetForReturn”-一旦找到“Search_Key”匹配项,将从“RefSheetRange”返回哪些数据列。
-“SetSheetRange”-您要将与“Search_Key”匹配的“RefSheetRange”中选择的信息放在哪里,或者您可以使用“return”,当函数完成时它将返回,以便您可以将函数输出到变量。
-“ReturnMultiResults” - 如果“Y”假设“Search_Key”是“NW”,并且您想在数据集中找到位于西北下方的连锁店中的每家商店。因此,在找到第一个匹配项后声明“Y”不会停止,它将继续搜索其余数据。
-“Add_Note” - 如果“Y”将结果设置为电子表格而不将其返回到内存,那么它将设置“SetSheetRange”中的第一个单元格,并注明内容和时间。
-“Has_NAs” - 如果是“Y”,它将在“#N/A”列中没有找到“Search_Key”的数据,否则它将将该列留空。
INDEX 和 MATCH 的组合应该起作用:
=INDEX($B$2:$D$1000,MATCH(S2,$A$2:$A$1000,0))
S2 是搜索关键字。
$A$2:$A$1000 是一个范围,我们将在其中查找。
$B$2:$D$1000 是一个范围,我们将返回。
请记住,$B$2:$D$1000 和 $A$2:$A$1000 的数字部分应该匹配。
function onSearch()
{
var searchString = "SD0023";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1");
var column =1; //column Index
var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
var searchResult = columnValues.findIndex(searchString); //Row Index - 2
if(searchResult != -1)
{
//searchResult + 2 is row index.
SpreadsheetApp.getActiveSpreadsheet().setActiveRange(sheet.getRange(searchResult + 2, 3)).setValue("found here");
}
}
Array.prototype.findIndex = function(search){
if(search == "") return false;
for (var i=0; i<this.length; i++)
if (this[i].toString().indexOf(search) > -1 ) return i;
return -1;
}
对搜索内联文本的答案进行了一些小改动。