gpt4 book ai didi

google-apps-script - 从具有指定字符串的电子表格返回行数据,而不循环遍历所有行

转载 作者:行者123 更新时间:2023-12-01 22:04:11 24 4
gpt4 key购买 nike

我手头有一项任务,其中我需要返回包含用户定义字符串的整个行数据

实现此目的的一种方法是循环遍历所有行,但是此仅当您知道要在哪一列中搜索时才有效,如使用下面给出的代码所示。

var sheetData = SpreadsheetApp.getActiveSpreadsheet().getDataRange().getValues();
var searchString = "testSearch";

for(var i=0;i<sheetData.getLastRow();i++)
{
//assuming we know that the search string is going to be in Column 2
if(sheetData[i][1].search(searchString)!=-1)
{
var rowData = sheetData[i];
return rowData;
}
}

所以我的问题是,有没有有什么方法可以实现这一点无需逐一循环所有行

为了使问题陈述更清楚,我希望实现类似“查找”功能的功能,如下图所示:

enter image description here

这将使浏览分布在多个工作表/电子表格中的大量数据变得非常容易

注意:我正在使用 Google Apps 脚本寻找解决方案。

最佳答案

以下代码用于从匹配的行中获取数据。它可以是部分匹配。您不需要知道列数或行数。您不需要知道要查看哪一列。

要使此代码正常工作,请将 Put Sheet Tab Name Here 替换为要使用的工作表选项卡的名称。 searchString 可以传递到函数中。如果未传入任何内容,则代码将使用硬编码值进行搜索。

function findRowOfSearchString(searchString) {
var arrIndexOfAllMatches,dataAsStringWithBrackets,dataRange,i,
isThereA_Match,j,ll,L,L2,matchOfAllInnerBrackets,numberOfColumns,numberOfRows,
rowCutOff,rowsOfMatchedData,sh,sheetData,ss,thisIndex,thisMatchIndex,thisRow,thisRowData;

ll = function(a,b) {
Logger.log(a + ": " + b)
}

if (!searchString) {
searchString = "testSe";
}

ss = SpreadsheetApp.getActiveSpreadsheet();
sh = ss.getSheetByName('Put Sheet Tab Name Here');//

dataRange = sh.getDataRange();

numberOfColumns = dataRange.getNumColumns();
numberOfRows = dataRange.getNumRows(); //changed 'getNumColumns' to 'getNumRows'

sheetData = dataRange.getValues();//Get a 2D array of all sheet data

dataAsStringWithBrackets = JSON.stringify(sheetData);
//ll('dataAsStringWithBrackets: ',dataAsStringWithBrackets)

isThereA_Match = dataAsStringWithBrackets.indexOf(searchString);
//ll('isThereA_Match: ',isThereA_Match)

if (isThereA_Match === -1) {return;}//There is no match - stop

arrIndexOfAllMatches = [];

L = dataAsStringWithBrackets.length;
//ll('L',L)

thisMatchIndex = 0;

for (i=0;i<L;i++) {
//ll('i',i)
thisMatchIndex = dataAsStringWithBrackets.indexOf(searchString,thisMatchIndex + 1);

//ll('thisMatchIndex',thisMatchIndex)

if (thisMatchIndex === -1) {//No more matches were found
//ll('No more matches found',thisMatchIndex)
break;
}

arrIndexOfAllMatches.push(thisMatchIndex);
}

//ll('arrIndexOfAllMatches',arrIndexOfAllMatches)

matchOfAllInnerBrackets = [];

thisMatchIndex = 0;

for (i=0;i<L;i++){
thisMatchIndex = dataAsStringWithBrackets.indexOf("],[",thisMatchIndex + 1);

//ll('thisMatchIndex',thisMatchIndex)

if (thisMatchIndex === -1) {//No more matches were found
//ll('No more matches found',thisMatchIndex)
break;
}

matchOfAllInnerBrackets.push(thisMatchIndex);
}

ll('matchOfAllInnerBrackets',matchOfAllInnerBrackets)

rowsOfMatchedData = [];
L = arrIndexOfAllMatches.length;
L2 = matchOfAllInnerBrackets.length;

for (i=0;i<L;i++){
thisIndex = arrIndexOfAllMatches[i];
ll('thisIndex: ' ,thisIndex)

for (j=0;j<L2;j++){
rowCutOff = matchOfAllInnerBrackets[j];
ll('rowCutOff: ',rowCutOff)

if (rowCutOff > thisIndex) {
ll('greater than: ' ,thisIndex > rowCutOff)
thisRow = j+1;
ll('thisRow: ', (thisRow))
rowsOfMatchedData.push(thisRow)
break;
}
}
}

ll('rowsOfMatchedData: ',rowsOfMatchedData)

L = rowsOfMatchedData.length;

for (i=0;i<L;i++){
thisRowData = sh.getRange(rowsOfMatchedData[i], 1, 1, numberOfColumns).getValues();
ll('thisRowData: ',thisRowData)
}
}

关于google-apps-script - 从具有指定字符串的电子表格返回行数据,而不循环遍历所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45214602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com