[英]Move Specific Rows depending on Filtering Keywords within unknown amount of rows using Google Sheets Apps Scripts
我做搜索引擎優化,因此我有很多關鍵字在不同的電子表格中流動。 我想要一種基於特定過濾器將它們過濾到單獨工作表中的方法,但我終生無法弄清楚如何在 Google Apps 腳本中執行此操作。
我為此制定的標准:
示例:過濾詞: 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
您的目標是為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.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);}
});
}
此功能會將您的所有結果放入相應單詞旁邊的第 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);
}
數據和輸出的圖像:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.