我将内部软件中的数据自动导出到工作表中。原始数据如下所示:
报告标题:, FTP - 记录完成的报告,,,,,, 报告已创建 作者:,“保罗·纽曼”,,,,,,报告生成日期/时间:,06/24/2024 07:01 AM,,,,,, 记录数:,2,,,,,, 记录数限制:,200000,,,,,, 报告 来源:,data.com,,,,,,,,,,,,, 培训 - 培训标题包含: FTP,,,,,,,“并且成绩单 - 成绩单状态是以下之一:已完成, 已完成(等效)“,,,,,,,,,,,,,,用户 - 用户全名,用户 - 位置、用户 - 经理 - 用户全名、培训 - 培训 标题、成绩单 - 成绩单状态、成绩单 - 成绩单已完成 日期、成绩单 - 成绩单分配日期、用户 - 用户状态“Bob, 米尔顿·琼斯”,法国 - 地点 A,“史蒂芬·琼斯”,FTP:地点 B - 第 1A 课:建筑布局,已完成,06/19/2024 03:30 PM,06/19/2024 03:06 PM,活动“Jules,Finnegan”,爱尔兰 - 地点 B,“Miles, 莫拉莱斯”,FTP:地点 B - 第 1A 课:建筑 布局,已完成,06/20/2024 07:00 AM,06/20/2024 07:15 PM,活跃
数据通过列分布到工作表中。报告中的人员越多,使用的列就越多。每次更新数据将继续出现在不同的行中。
我想要实现的目标是将以下内容隔离在另一个选项卡上:
姓名 | 地点 | 培训名称 | 交付日期 | 完成日期 |
---|---|---|---|---|
鲍勃,米尔顿·琼斯 | 法国 - 地点 A | 地点 B - 第 1A 课:建筑布局 | 2024/06/19 03:06 下午 | 2024年6月19日下午3:30 |
朱尔斯·芬尼根 | 爱尔兰 - 地点 B | 地点 B - 第 1A 课:建筑布局 | 2024/06/20 07:00 | 2024年6月20日下午7:15 |
我尝试了 Split、Byrow 等,但无法按照我想要的方式隔离这些数据 有人可以帮忙吗?
这是一个测试表,显示了表中的布局: 测试表
注意:此答案是一种解决方法,因为提供的数据的单元格中没有模式。
使用
Google Sheets Formulas
,您可以尝试以下用途:
A2
=SPLIT(RIGHT(Sheet1!BZ2,LEN(Sheet1!BZ2)-FIND("""",Sheet1!BZ2)) & "," & " " & LEFT(Sheet1!CA2,LEN(Sheet1!CA2)-1) & " " & "|" & " " & Sheet1!CB2 & " " & "|" & " " & REGEXREPLACE(Sheet1!CD2, "FTP:", "") & " " & "|" & " " & Sheet1!CF2 & " " & "|" & " " & Sheet1!CG2, "|", TRUE, TRUE)
A3
=SPLIT(RIGHT(Sheet1!CH2,LEN(Sheet1!CH2)-FIND("""",Sheet1!CH2)) & "," & " " & LEFT(Sheet1!CI2,LEN(Sheet1!CI2)-1) & " " & "|" & " " & Sheet1!CJ2 & " " & "|" & " " & REGEXREPLACE(Sheet1!CL2, "FTP:", "") & " " & "|" & " " & Sheet1!CN2 & " " & "|" & " " & Sheet1!CO2, "|", TRUE, TRUE)
我使用竖线
\|
作为 SPLIT function
的分隔符来分隔列中的数据。唯一的问题是您必须手动输入其他行的引用单元格。
使用
Google Apps Script
,假设数据集仅使用8个单元格,与第一个使用8个,第二个使用9个的示例不同,您可以使用此脚本来实现您想要做的事情:
我还添加了一些代码功能的解释
const myFunction = () => {
// Gets your current active spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Gets the spreadsheet named "Sheet1"
var sh1 = ss.getSheetByName("Sheet1");
// Gets the spreadsheet named "Sheet2"
var sh2 = ss.getSheetByName("Sheet2");
// Gets the first row values from "BZ2" to the last column
var vl = sh1.getRange(2, 78, 1, ss.getLastColumn() - 1).getValues()[0];
// Filters the data and removes empty spaces
var fd = vl.filter(dt => dt != "");
// Empty array
var op = [];
// Loops through the filtered data in groups of 8
for (var i = 0; i < fd.length; i += 8) {
// Separates the data to have 8 cells each
var arr = vl.slice(i, i + 8);
// Removes the first quotation mark as well as everything before it
arr[0] = arr[0].replace(/^.*"/, '"').replace(/"/, "");
// Removes the second quotation mark
arr[1] = arr[1].replace(/"/g, "");
// Combines the processed first element with the second, adding a comma separator
arr.unshift(arr[0] + ", " + arr[1]);
// Removes the "[1, 1, 2, 3]" elements
[1, 1, 2, 3].forEach(i => {
arr.splice(i, 1);
});
// Removes "FTP:" from the third element
arr[2] = arr[2].replace(/^FTP: /, "");
// Pushes the processed data into the output array
op.push(arr);
}
// Sets the values of the combined data in "Sheet2"
sh2.getRange(2, 1, op.length, op[0].length).setValues(op);
}
确保您转到 Extensions > Apps Script 并在那里运行该函数,因为它会要求授权。
是第二个示例中的第 9 个单元格,代码将其视为新组的第一个单元格,这就是它位于Active
上的原因。A4