javascript - 在 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
目标电子表格中的工作表名称中。
我可以像上面那样理解。如果我的理解是正确的,那么这个修改呢?不幸的是,修改后的脚本与您的原始脚本有很大的不同。我为此道歉。我认为您的情况有几个答案。所以请认为这只是其中之一。
修改后的脚本流程如下。
- 从源工作表中检索值。
- 创建一个对象以检索每个目标工作表的值。
- 对象就像
{"BGT": [values], "SWO": [values],,,}
.
- 对象就像
- 放置目标工作表的值。
修改后的脚本:
在运行脚本之前,请设置srcSpreadsheetId
,dstSpreadsheetId
和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]);
});
}
笔记:
- 正如我在评论中提到的,检索的值
getValues()
是二维数组。因此,如果Array.includes()
可以在 Google Apps 脚本中使用,在您的脚本中,ConceptName.includes("BGT")
始终为false
. 而且,很遗憾,Array.includes()
不能在 Google Apps Script 中使用。参考 - 此修改后的脚本是使用您共享的“示例原始数据”和“排序数据”的示例电子表格准备的。因此,如果您的实际电子表格与这些示例不同,请修改上述脚本。
- 当源电子表格的值和目标工作表的数量增加很多时,我建议使用 Sheets API 来放置每个目标工作表的值。
参考:
推荐阅读
- android - 在 logcat android studios 上找不到令牌
- spring - 如何在 Spring Boot OAuth2 服务器中启用多个客户端 ID?
- angular - 有没有办法从Angular 6中的HttpInterceptor注入观察:“响应”?
- c++ - Visual Studio C++ 错误:需要一个标识符
- tabs - 工作区的布局选项卡存储在哪里
- dart - 在 BLoC 之间共享数据的干净方式
- c# - 如何使用用户的 Windows 凭据从共享文件夹下载文件?
- c++ - Boost ASIO 和串口异步读取
- amazon-web-services - Terraform AWS S3 到 Lambda 通知触发器
- mysql - mysql now() 返回 2018-00-00 0:00:00