将一张工作表中的原始数据排序到Google App脚本中新工作表中的单独标签中

时间:2019-05-30 22:42:55

标签: javascript arrays sorting google-apps-script filter

我有一个大的数据文件,希望将其分离/过滤到新工作表的单独选项卡中。它们需要由字符串中包含“ 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,

1 个答案:

答案 0 :(得分:0)

  • 您在源电子表格的“ 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()检索的值是二维数组。因此,如果Array.includes()可以在Google Apps脚本中使用,则在您的脚本中,ConceptName.includes("BGT")始终为false。而且,不幸的是,Array.includes()不能在Google Apps脚本中使用。 Ref
  • 此修改后的脚本是使用您共享的“示例原始数据”和“排序数据”的电子表格示例准备的。因此,如果您的实际电子表格与这些示例不同,请修改上面的脚本。
  • 当源电子表格的值和目标工作表的数量大大增加时,我建议使用Sheets API为每个目标工作表放置值。

参考文献: