簡體   English   中英

將一張工作表中的原始數據排序到Google App腳本中新工作表中的單獨標簽中

[英]Sorting raw data from one sheet into separate tabs on a new sheet in Google App Script

我有一個大的數據文件,希望將其分離/過濾到新工作表的單獨選項卡中。 它們需要由字符串中包含“ BGT”的特定列過濾。

我對使用Google Apps腳本非常陌生,因此這項工作正在進行中。 我能夠將數據從一張紙拉到另一張紙,將其轉換為數組,並分配要排序的列。 我只是無法正確設置過濾器。

function CreativeReport() {

  var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = ss.getSheetByName(SHEET_NAME);

  var folder = getDriveFolderFromPath("Daily Creative Audit");

  var fileId = folder.getFiles().next().getId();

  var RawMM = SpreadsheetApp.openById(fileId);
  var ArrayRawData = RawMM.getRange(2,1,RawMM.getLastRow()-1,5).getValues();

  var ConceptName = RawMM.getRange('A:A').getValues();
  var BGTFilter = ConceptName.includes("BGT");
  var BGTFilteredData = ArrayRawData.filter(function(item){ return item [6] === BGTFilter;}); 

  Logger.log(BGTFilteredData);

我要排序購買的列包含格式如下的單元格

2019_BGT_Bigsale_300x50  
2019_SWT_Bigsale_300x50  
2019_AI_Bigsale_300x50  
2019_SWO_Bigsale_300x50  
2019_DCO_Bigsale_300x50.   

目標是讓腳本過濾該原始數據,並根據包含以下內容的單元格將其分類為單獨的工作表:

BGT  
SWO  
SWT  
AI  
DCO  

我應該如何僅注銷字符串中包含“ BGT”的概念的代碼,但我得到了

TypeError: Cannot find function includes in object ,concept_name,
  • 您在源電子表格的“ Sheet1”處具有值。
  • 您想通過檢查列“ A”是否具有BGT, SWO, SWT, AI, DCO的值來分隔值。
  • 您要將分隔的值放在目標電子表格中的BGT, SWO, SWT, AI, DCO的工作表名稱中。

我可以像上面那樣理解。 如果我的理解是正確的,那么該修改如何? 不幸的是,修改后的腳本與原始腳本相比已發生很大變化。 我為此表示歉意。 我認為您的情況有幾個答案。 因此,請僅考慮其中之一。

修改后的腳本的流程如下。

  1. 從源工作表中檢索值。
  2. 創建一個對象以檢索每個目標表的值。
    • 該對象類似於{"BGT": [values], "SWO": [values],,,}
  3. 輸入目標表的值。

修改后的腳本:

在運行腳本之前,請設置srcSpreadsheetIddstSpreadsheetIdsrcSheetName

function CreativeReport() {
  // Variables: Please set them for your situation.
  var srcSpreadsheetId = "###"; // Please set the source Spreadsheet ID. In your sample, the Spreadsheet name is "Sample Raw Data".
  var dstSpreadsheetId = "###"; // Please set the destination Spreadsheet ID. In your sample, the Spreadsheet name is "Sorted Data".
  var srcSheetName = "Sheet1"; // Please modify this. In this sample, it's the same with your sample Spreadsheet.
  var dstSheetNames = ["BGT", "SWO", "DCO", "AI", "SWT"];

  // Open Spreadsheets
  var srcSS = SpreadsheetApp.openById(srcSpreadsheetId);
  var dstSS = SpreadsheetApp.openById(dstSpreadsheetId);

  // Retrieve values from the source sheet.
  var srcSheet = srcSS.getSheetByName(srcSheetName);
  var srcValues = srcSheet.getRange(2, 1, srcSheet.getLastRow() - 1, 5).getValues();

  // Create an object for retrieving values for each destination sheet.
  var object = srcValues.reduce(function(obj, e) {
    dstSheetNames.forEach(function(f) {
      if (e[0].indexOf(f) > -1) obj[f] = obj[f] ? obj[f].concat([e]) : [e];
    });
    return obj;
  }, {});

  // Put values for the destination sheets.
  dstSheetNames.forEach(function(e) {
    var sheet = dstSS.getSheetByName(e);
    sheet.getRange(sheet.getLastRow() + 1, 1, object[e].length, object[e][0].length).setValues(object[e]);
  });
}

注意:

  • 如我的評論所述,由getValues()檢索的值是二維數組。 因此,如果可以在Google Apps腳本中使用Array.includes() ,則在您的腳本中, ConceptName.includes("BGT")始終為false 而且,不幸的是, Array.includes()不能在Google Apps腳本中使用。 參考
  • 使用您共享的“樣本原始數據”和“分類數據”的樣本電子表格來准備此修改后的腳本。 因此,如果您的實際電子表格與這些示例不同,請修改上面的腳本。
  • 當源Spreadsheet的值和目標工作表的數量大大增加時,我建議使用Sheets API為每個目標工作表放置值。

參考文獻:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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