为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Google Sheets Apps 脚本根据未知数量的行中的过滤关键字移动特定行

使用 Google Sheets Apps 脚本根据未知数量的行中的过滤关键字移动特定行

幕布斯6054654 2023-07-14 15:08:25
我做搜索引擎优化,因此我有很多关键字在不同的电子表格中流动。我想要一种方法来根据特定的过滤器将这些过滤到单独的工作表中,但我一生都无法弄清楚如何在 Google Apps 脚本中执行此操作。我为自己设定的标准是:在第 1+2 列中输入字符串及其相应卷的列表。过滤词列表写在第 3 列中。该脚本必须为每个过滤词创建一个新工作表,如果字符串包含过滤词,则将字符串+卷移动到这些不同的工作表中。示例:过滤词:Apple, Banana, Pineapple字符串:“苹果很大”,卷:“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      }   }}示例表:https://docs.google.com/spreadsheets/d/15YIMyGmmfZdy094gwuJNxFmTd8h7NOLnA8KevZrGtdU/edit? usp=sharing
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

解释:

  • 您的目标是为C列中的每个过滤词创建一个工作表。然后将A、B列中的数据复制到相应的工作表中,但仅复制包含过滤词的行。

  • 对于初学者,您需要获取过滤词列表。您可以获得C列的完整范围并过滤掉空单元格:

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

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

      if(!ss.getSheetByName(s)){
      ss.insertSheet().setName(s);}
  • 下一步是过滤包含过滤词data的行:

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

    sheet.getRange(sheet.getLastRow()+1,1,f_data.length,f_data[0].length).setValues(f_data)

解决方案

function myFunction() {

  const ss = SpreadsheetApp.getActive();

  const sh = ss.getSheetByName('Ark1');

  const filter_sh = ss.getSheetByName('Filter');

  const data = sh.getRange('A1:B'+sh.getLastRow()).getValues();

  const sh_names = filter_sh.getRange('A1:A'+filter_sh.getLastRow()).getValues().flat();

  sh_names.forEach(s=>{

    if(!ss.getSheetByName(s)){

    ss.insertSheet().setName(s);}

    let sheet = ss.getSheetByName(s);   

    let f_data = data.filter(r=>r[0].includes(s));

    if(f_data.length>0){

    sheet.getRange(sheet.getLastRow()+1,1,f_data.length,f_data[0].length).setValues(f_data);}

}); 

}


查看完整回答
反对 回复 2023-07-14
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

此函数会将所有结果放入相应单词旁边的第 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);

}

数据和输出图像:

//img1.sycdn.imooc.com//64b0f49e0001744a06540229.jpg

查看完整回答
反对 回复 2023-07-14
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信