Google apps script 从2个范围中查找匹配项并用特定值替换匹配项,是否有优化的方法?
这是样品单。 由此Google apps script 从2个范围中查找匹配项并用特定值替换匹配项,是否有优化的方法?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,这是样品单。 由此 1 Search area Bounty list Bullet 2 a i z a b c abc 3 e b d d e f def 4 y f h g h i ghi 5 6 1 2 3 4 5 6 7 8
1 Search area Bounty list Bullet
2 a i z a b c abc
3 e b d d e f def
4 y f h g h i ghi
5
6 1 2 3 4 5 6 7 8
7 Column #
对此
1 Search area Bounty list Bullet
2 abc ghi z a b c abc
3 def abc def d e f def
4 y def ghi g h i ghi
5
6 1 2 3 4 5 6 7 8
7 Column #
它将从“赏金列表”中获取一个值“赏金”,从(2,5)或“a”开始,按顺序从a、i、z、e、b、d、y、f、h搜索“搜索区域”。然后,如果它发现一个或多个单元格等于“bounty”的值,那么它将把当前“bounty”行第8列中的“bullet”值放到这些单元格中。该过程将按照“赏金名单”上的a、b、c、d、e、f、g、h、i的顺序重复。两个进程都向左和向下移动
function menuItem1()
{
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var target = sheet.getDataRange().getValues();
for (var BountyRow = 2; BountyRow<target.length; BountyRow++)//switching rows in bounty list//
{
var bullet = sheet.getRange(BountyRow, 8).getValue(); //cell value to paste on targets//
for (var BountyColumn = 5; BountyColumn<8; BountyColumn++) //switching columns in bounty list//
{
var bounty = sheet.getRange(BountyRow, BountyColumn).getValue(); // cell value to search for//
if (bounty !=0)
{
for (var SearchRow = 1; SearchRow<target.length; SearchRow++) //switching row on search area//
{
for(var SearchColumn = 0; SearchColumn<4;SearchColumn++)//switching column on search area//
{
if(target[SearchRow][SearchColumn] == bounty) //if search target is found//
{
var found = target[SearchRow][SearchColumn];
sheet.getRange(SearchRow+1, SearchColumn+1).setValue(bullet);
Logger.log((found)+ " in "+"row"+(SearchRow+1)+", column"+(SearchColumn+1));
}
}
}
}
}
}
}
函数menuItem1()
{
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var target=sheet.getDataRange().getValues();
对于(var BountyRow=2;BountyRow)为了优化代码,您需要做两件事:
而不是对每个单元格使用getValue()
和setValue()
(这会使您的代码编写速度变慢)
- 使用
getValues()
- 将值赋给数组
- 替换数组中的匹配项
- 使用
setValues()
利用和
查找匹配项并更有效地替换它们
示例:
function menuItem1(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow=sheet.getLastRow();
var searchValues=sheet.getRange(2,1,lastRow-2+1,3).getValues();
var bountyValues=sheet.getRange(2,5,lastRow-2+1,3).getValues();
var bulletValues=sheet.getRange(2,8,lastRow-2+1,1).getValues();
for (var i = 0; i<bountyValues.length; i++){
for (var j = 0; j<bountyValues[0].length; j++){
if (bountyValues[i][j] !=0){
replaceValues(searchValues, bountyValues[i][j], bulletValues[i][0]);
}
}
}
sheet.getRange(2,1,lastRow-2+1,3).setValues(searchValues)
}
function replaceValues(search, bounty, bullet) {
for(var k=0;k<search.length;k++){
search[k]=search[k].map(function(search) {
var regex=new RegExp("\\b"+bounty+"\\b","g");
return search.toString().replace(regex, bullet);
});
}
}
函数menuItem1(){
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow=sheet.getLastRow();
var searchValues=sheet.getRange(2,1,lastRow-2+1,3).getValues();
var bountyValues=sheet.getRange(2,5,lastRow-2+1,3).getValues();
var bulletValues=sheet.getRange(2,8,lastRow-2+1,1).getValues();
对于(var i=0;iWelcome.“右边的列表”和“左边的列表”之间的区别不清楚。例如,右边的列表是否包含第i列,以及第i列的用途是什么。请阅读并编辑您的问题,以提供不太含糊的解释。还请共享您的电子表格(较少的私人或机密信息)并包括一个成功结果的示例。lastRow-2+1与lastRow-1有区别吗?没有。我只是想说明行数等于“最后一行第一行+1”