CSV 自动提取到工作表中。需要过滤帮助

问题描述 投票:0回答:1

我将内部软件中的数据自动导出到工作表中。原始数据如下所示:

报告标题:, 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 split array-formulas
1个回答
0
投票

建议

注意:此答案是一种解决方法,因为提供的数据的单元格中没有模式。

选项 1

使用

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
的分隔符来分隔列中的数据。唯一的问题是您必须手动输入其他行的引用单元格。

输出

image

选项 2

使用

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 并在那里运行该函数,因为它会要求授权。

输出

image

Active
是第二个示例中的第 9 个单元格,代码将其视为新组的第一个单元格,这就是它位于
A4
上的原因。

© www.soinside.com 2019 - 2024. All rights reserved.