Javascript 根据使用Google Sheets Apps脚本在未知行数内过滤关键字来移动特定行

Javascript 根据使用Google Sheets Apps脚本在未知行数内过滤关键字来移动特定行,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我做搜索引擎优化,因此我有很多关键字在不同的电子表格中流动。我想要一种基于特定过滤器将这些内容过滤到单独的表单中的方法,但我无法在我的一生中,找出如何在谷歌应用程序脚本中做到这一点 我为自己制定的标准是: 列1+2中输入了字符串及其相应卷的列表 过滤词列表写在第3列中 脚本必须为每个过滤词创建一个新的工作表,如果字符串包含过滤词,则将字符串+卷移动到这些不同的工作表中 例如: 过滤词:苹果、香蕉、菠萝 字符串:“苹果很大”,卷:“100” 脚本会将字符串和卷移动到第1行名为“Apple”的表

我做搜索引擎优化,因此我有很多关键字在不同的电子表格中流动。我想要一种基于特定过滤器将这些内容过滤到单独的表单中的方法,但我无法在我的一生中,找出如何在谷歌应用程序脚本中做到这一点

我为自己制定的标准是:

  • 列1+2中输入了字符串及其相应卷的列表
  • 过滤词列表写在第3列中
  • 脚本必须为每个过滤词创建一个新的工作表,如果字符串包含过滤词,则将字符串+卷移动到这些不同的工作表中
例如: 过滤词:
苹果、香蕉、菠萝

字符串:“苹果很大”,卷:“100”

脚本会将字符串和卷移动到第1行名为“Apple”的表中

(注意,我对编码毫无经验) 我相信您可以使用以下结构:

for(let i = 0; i <= column3RowAmount; i++){ //Run as long as there are more filter words
   create(column3Row[i]); //create a new sheet with the name of the filter word
   for(let j = 0; j <= column1RowAmount; j++){ //Run as long as there are more keywords
      if(column1Row[j].indexOf(column3Row[i]) >= 0){ //If the Row in column 1 contains the filter word
         column1Row[j].moveToSheet(column3Row[i]); // Make sure not to move Column 3, but only 1+2
      }
   }
}
for(设i=0;i解释:
  • 您的目标是为列C中的每个过滤词创建一个工作表。然后将列a、B中的数据复制到相应的工作表中,但仅将包含该过滤词的行复制到相应的工作表中

  • 首先,您需要获取过滤词列表。您可以获取列C的完整范围,并过滤掉空单元格:

    const sh_names = sh.getRange('C1:C').getValues().flat().filter(r=>r!='');
    
  • 同样,您需要获取列AB中的数据:

    const data = sh.getRange('A1:B'+sh.getLastRow()).getValues();
    
  • 下一步是迭代
    sh_name
    ,对于每个元素/过滤词,检查是否存在具有该名称的工作表。如果不存在,则创建具有该名称的工作表,如果存在,则跳过创建部分:

      if(!ss.getSheetByName(s)){
      ss.insertSheet().setName(s);}
    
  • 下一步是筛选筛选字所在行的
    数据

    let f_data = data.filter(r=>r[0].includes(s));
    
  • 最后,检查数据长度是否大于
    0
    ,否则没有数据可使用,并将
    data
    的值设置到相应的表中:

    sheet.getRange(sheet.getLastRow()+1,1,f_数据.length,f_数据[0].length).设置值(f_数据)

解决方案
这个函数将把你的所有结果放在第4列相应的单词旁边,而不是为每个单词创建一个页面。因此它运行得更快

function stringswords() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Sheet1');
  const sr=2;
  const rgd=sh.getRange(sr,1,sh.getLastRow()-sr+1,2);
  const data=rgd.getDisplayValues();
  const rgw=sh.getRange(sr,3,sh.getLastRow()-sr+1,1);
  const words=rgw.getDisplayValues().flat();
  const wiObj={};
  words.forEach(function(w,i){wiObj[w]=i});
  const rgr=sh.getRange(sr,4,sh.getLastRow()-sr+1,1);
  rgr.clearContent();
  var results=rgr.getValues();
  words.forEach(function(w,i,A){
    data.forEach(function(r,j,D) {
      if(data[j][0] && data[j][0].indexOf(w)!=-1) {
        results[wiObj[w]][0]+=Utilities.formatString('String:%s Vol:%s\n',data[j][0],data[j][1]);
      }
    });
  });
  rgr.setValues(results);
}
数据和输出的图像:


@JonasSkalbo请点击答案左侧的勾号按钮接受答案:)很高兴它解决了您的问题。好的,第一次工作,现在它只是说:“无法读取null的属性'getRange'(第4行,文件“代码”)。有没有办法删除原始工作表中已移动的行?@JonasSkalbo它说,因为您将工作表的名称从
Ark1
更改为
Keywords
。在我提供的代码中查找
Ark1
,并将其替换为
Keywords
。此外,stackoverflow不允许后续问题。如果是你有一个后续问题,请发布一个新问题。谢谢,很抱歉给你带来不便。我已经创建了一个新问题,谢谢你的指导,谢谢你的帮助:)
function stringswords() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Sheet1');
  const sr=2;
  const rgd=sh.getRange(sr,1,sh.getLastRow()-sr+1,2);
  const data=rgd.getDisplayValues();
  const rgw=sh.getRange(sr,3,sh.getLastRow()-sr+1,1);
  const words=rgw.getDisplayValues().flat();
  const wiObj={};
  words.forEach(function(w,i){wiObj[w]=i});
  const rgr=sh.getRange(sr,4,sh.getLastRow()-sr+1,1);
  rgr.clearContent();
  var results=rgr.getValues();
  words.forEach(function(w,i,A){
    data.forEach(function(r,j,D) {
      if(data[j][0] && data[j][0].indexOf(w)!=-1) {
        results[wiObj[w]][0]+=Utilities.formatString('String:%s Vol:%s\n',data[j][0],data[j][1]);
      }
    });
  });
  rgr.setValues(results);
}