Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 从2个范围中查找匹配项并用特定值替换匹配项,是否有优化的方法?_Google Apps Script_Google Sheets - Fatal编程技术网

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”