简体   繁体   中英

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

I have a large data file that I want to be separated/filtered out into separate tabs on a new sheet. They need to be filtered by a certain column containing "BGT" within the string.

I am very new to using Google Apps Script so this is a work in progress. I am able to pull the data from one sheet into another, convert it to an array and assign the column I want to sort by. I just can't properly set up the filter.

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);

The column I want to sort buy contains cells formatted like this

2019_BGT_Bigsale_300x50  
2019_SWT_Bigsale_300x50  
2019_AI_Bigsale_300x50  
2019_SWO_Bigsale_300x50  
2019_DCO_Bigsale_300x50.   

The goal is to have the script filter this raw data, and sort it into separate sheets depending on the cells containing:

BGT  
SWO  
SWT  
AI  
DCO  

The code I how SHOULD log out just the concepts containing "BGT" in the string but I get

TypeError: Cannot find function includes in object ,concept_name,
  • You have values at "Sheet1" in the source Spreadsheet.
  • You want to separate the values by checking whether the column "A" has the values of BGT, SWO, SWT, AI, DCO .
  • You want to put the separated values to the sheet names of BGT, SWO, SWT, AI, DCO in the destination Spreadsheet.

I could understand like above. If my understanding is correct, how about this modification? Unfortunately, the modified script was largely changed from your original script. I apologize for this. I think that there are several answers for your situation. So please think of this as just one of them.

The flow of the modified script is as follows.

  1. Retrieve values from the source sheet.
  2. Create an object for retrieving values for each destination sheet.
    • The object is like {"BGT": [values], "SWO": [values],,,} .
  3. Put values for the destination sheets.

Modified script:

Before you run the script, please set srcSpreadsheetId , dstSpreadsheetId and srcSheetName .

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]);
  });
}

Note:

  • As mentioned at my comment, the values retrieved by getValues() is 2 dimensional array. So if Array.includes() can be used at Google Apps Script, in your script, ConceptName.includes("BGT") is always false . And, unfortunately, Array.includes() cannot be used at Google Apps Script. Ref
  • This modified script was prepared using the sample Spreadsheets of "Sample Raw Data" and "Sorted Data" you shared. So if your actual Spreadsheet is different from these samples, please modify above script.
  • When the values of source Spreadsheet and the number of destination sheets are much increased, I recommend to use Sheets API for putting the values for each destination sheet.

References:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM