簡體   English   中英

根據使用 Google Sheets Apps Scripts 在未知數量的行中過濾關鍵字來移動特定行

[英]Move Specific Rows depending on Filtering Keywords within unknown amount of rows using Google Sheets Apps Scripts

我做搜索引擎優化,因此我有很多關鍵字在不同的電子表格中流動。 我想要一種基於特定過濾器將它們過濾到單獨工作表中的方法,但我終生無法弄清楚如何在 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

解釋:

  • 您的目標是為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM