2 回答

TA貢獻1854條經驗 獲得超8個贊
解釋:
您的目標是為C列中的每個過濾詞創(chuàng)建一個工作表。然后將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
每個元素/過濾詞,檢查是否存在具有該名稱的工作表。如果不存在,則創(chuàng)建一個具有該名稱的工作表,如果存在則跳過創(chuàng)建部分:??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 列,而不是為每個單詞創(chuàng)建一個頁面。所以它運行得更快。
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);
}
數據和輸出圖像:
添加回答
舉報