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!='');
- 同样,您需要获取列A和B中的数据:
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);
}