2 回答
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);}
});
}
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);
}
数据和输出图像:
添加回答
举报