【问题标题】:Converting all files in drive folder from sheets to CSV and add to new folder将驱动器文件夹中的所有文件从工作表转换为 CSV 并添加到新文件夹
【发布时间】:2019-07-25 22:11:18
【问题描述】:

我有:

  • .xlsx 文件每天自动导入到 Google Drive 文件夹中

我想要:

  • 每个文件都转换为 CSV 并保存到不同的文件夹中
  • 每个文件都转换为 Google 表格并保存到不同的文件夹中
  • 处理完成后删除的原始 xlsx 文件

目前我的流程是这样的:

  • 将 xlsx 转换为 2 个新文件:CSV 和 Google 表格
  • 将 CSV 保存到 CSV 文件夹
  • 将 Google 表格保存到表格文件夹

我最初使用此 https://ctrlq.org/code/20248-convert-excel-to-csv 教程转换为 CSV,直到我意识到它将每个 .xlsx 工作表的“无标题”副本作为 Drive 电子表格保存到我的根文件夹。我不知道如何为那些无标题的人分配标题或文件夹位置。能够做到这一点也可以解决我眼前的问题。

然后我尝试使用此(下)https://ctrlq.org/code/20500-convert-microsoft-excel-xlsx-to-google-spreadsheet 的修改版本和 MimeType .CSV,它正确地将我的 CSV 放置在具有正确名称的正确文件夹中,但数据未正确解析并且看起来已损坏。

function exceltoSheets() {
  var SOURCE_XLS_FOLDER = '123465';
  var SHEET_FOLDER = '789456';
  var CSV_TEST = '456123';

  var sourceFolderID = DriveApp.getFolderById(SOURCE_XLS_FOLDER),
      mimes = [MimeType.MICROSOFT_EXCEL, MimeType.MICROSOFT_EXCEL_LEGACY];

  for (var m = 0; m < mimes.length; m++) {
    var sourceFiles = sourceFolderID.getFilesByType(mimes[m]);

    while (sourceFiles.hasNext()) {
       try {
         var sourceFile = sourceFiles.next();
         var sourceName = sourceFile.getName().replace(".xlsx","");
         var sourceNameTC = sourceName + ".csv"
         var sourceNameDS = "ds_data_import_" + sourceName;

         var fileId = sourceFile.getId(); 
         var blob = sourceFile.getBlob();
         var resourceDS = {
           title: sourceNameDS,
           mimeType: MimeType.GOOGLE_SHEETS,
           convert: true,
           parents: [{id: SHEET_FOLDER}]
         };
         var resourceTC = {
           title: sourceNameTC,
           mimeType: MimeType.CSV, 
           convert: true,
           parents: [{id: CSV_TEST}],
         };

         Drive.Files.insert(resourceDS, blob);
         Drive.Files.insert(resourceTC, blob);

       } catch (f) {
         Logger.log(f.toString());
       }
      sourceFile.setTrashed(true);
    }
  }
}

如果我正确解析 CSV,我最终会在我的根文件夹中看到无标题的工作表,如果我正确解析工作表,我最终会得到损坏的 CSV。我想要结果:

  • xlsx在指定文件夹中转换为CSV
  • xlsx 转换为指定文件夹中的 Google 表格
  • xlsx 处理完成后从驱动器中删除

【问题讨论】:

  • 我能问一下你的情况吗? 1. 文件夹有子文件夹,要查看所有子文件夹的文件吗? 2. XLSX 文件的最大大小是多少? 3. 我认为I need 可能与All I want is 不同。这个怎么样?
  • 所有文件夹都没有子文件夹,只有文件夹中包含的所有文件/放置在根目录下的新文件夹中。 XLSX 文件有些标准,每个文件有 21 列,不到 1,000 行,不到 60 KB。我也更新了语言谢谢。
  • 感谢您的回复和更新。您想使用特定文件夹下的 XLSX 文件(小于 60 KB)。我可以这样理解。我还有一个问题。我无法理解xlsx data aggregated to last line in sheet fileall data in each file copied after row 12 and saved to the last line in a designated drive spreadsheet。从您的脚本和问题中,我无法理解从 XLSX 文件中检索值后的过程。我可以问你这个吗?我为我糟糕的英语水平道歉。
  • 感谢您的耐心等待!实际上我没有将它包含在我的初始代码中并在最后一个小时计算出聚合,我将再次更新问题。转换我的文件并将它们放在正确的文件夹中是我需要帮助的。
  • 感谢您的回复。我以为我能理解你的问题。所以我提出了一个修改后的脚本作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

标签: google-apps-script google-sheets google-drive-api google-sheets-api


【解决方案1】:
  • 您想将特定文件夹中的 XLSX 文件转换为 Google 电子表格。
  • 您希望将转换后的电子表格放入特定文件夹。
  • 您想通过修改脚本来实现。

如果我的理解是正确的,那么这个修改呢?请认为这只是几个答案之一。

修改点:

  • 为了检索MimeType.MICROSOFT_EXCELMimeType.MICROSOFT_EXCEL_LEGACY的文件,我使用了searchFiles()
  • 为了将 XLSX 文件转换为 Google 电子表格并将其放入特定文件夹,我使用了Drive.Files.copy()

修改脚本:

使用时请确认是否在高级谷歌服务中启用了Drive API。

function exceltoSheets() {
  var SOURCE_XLS_FOLDER = '###'; // Please set the source folder ID here.
  var dstFolderId = '####'; // Please set the destination folder ID here.

  var sourceFolderID = DriveApp.getFolderById(SOURCE_XLS_FOLDER);
  var searchQuery = "mimeType='" + MimeType.MICROSOFT_EXCEL + "' or mimeType='" + MimeType.MICROSOFT_EXCEL_LEGACY + "'";
  var sourceFiles = sourceFolderID.searchFiles(searchQuery);
  while (sourceFiles.hasNext()) {
    var sourceFile = sourceFiles.next();
    var fileId = sourceFile.getId();
    Drive.Files.copy({mimeType: MimeType.GOOGLE_SHEETS, parents: [{id: dstFolderId}]}, fileId);
    sourceFile.setTrashed(true);
  }
}

注意:

  • 如果要直接删除XLSX文件,可以使用Drive.Files.remove(fileId)代替sourceFile.setTrashed(true)

参考资料:

编辑:

  • 您希望将 XLSX 文件转换为 CSV 和 Google 电子表格文件。
  • 您希望将转换后的 XLSX 文件和 CSV 文件放到每个文件夹中。

针对这种情况,修改后的脚本如下。

function exceltoSheets() {
  var SOURCE_XLS_FOLDER = '###'; // Please set the source folder ID here.
  var dstFolderIdForSpreadsheet = '###'; // Please set the destination folder ID for Spreadsheet here.
  var dstFolderIdForCSV = '###'; // Please set the destination folder ID for CSV here.

  var sourceFolder = DriveApp.getFolderById(SOURCE_XLS_FOLDER);
  var destinationFolderForCSV = DriveApp.getFolderById(dstFolderIdForCSV);
  var searchQuery = "mimeType='" + MimeType.MICROSOFT_EXCEL + "' or mimeType='" + MimeType.MICROSOFT_EXCEL_LEGACY + "'";
  var sourceFiles = sourceFolder.searchFiles(searchQuery);
  while (sourceFiles.hasNext()) {
    var sourceFile = sourceFiles.next();
    var fileId = sourceFile.getId();
    var spreadsheet = Drive.Files.copy({mimeType: MimeType.GOOGLE_SHEETS, parents: [{id: dstFolderIdForSpreadsheet}]}, fileId);
    var sheets = SpreadsheetApp.openById(spreadsheet.id).getSheets();
    sheets[0].getDataRange().getValues()
    var csv = sheets.map(function(sheet) {return sheet.getDataRange().getValues().reduce(function(csv, row) {return csv += row.join(",") + "\n"}, "")});
    destinationFolderForCSV.createFile(spreadsheet.title + ".csv", csv, MimeType.CSV)
    sourceFile.setTrashed(true);
  }
}

【讨论】:

  • @eherr 那只会转换为表格。要转换为 Csv,您只需在删除源文件之前添加以下行:Drive.Files.copy({mimeType: MimeType.CSV, parents: [{id: dstFolderIdCsv}]}, fileId); 以 dstFolderIdCsv 作为 Csv 目标文件夹 ID developers.google.com/apps-script/reference/base/mime-type
  • @AndresDuarte 该解决方案无法转换为 CSV,文件已损坏。还有其他选择吗?
  • @eherr 我误解了你的问题。我为我不完整的答案和我糟糕的英语水平深表歉意。您想将 XLSX 文件转换为 CSV 和 Google 电子表格文件。我可以证实这一点。所以我更新了我的答案。你能确认一下吗?如果我误解了您的问题并且这不是您想要的方向,我再次道歉。
  • @Andres Duarte 感谢您的支持。不幸的是,在当前阶段,无法使用Drive.Files.copy() 将 XLSX 文件转换为 CSV 格式。这可以在About: get of Drive API 确认。为此,请将importFormats 设置为fields。所以我建议将转换后的电子表格转换为 CSV 数据。
猜你喜欢
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 2016-12-17
  • 2023-02-10
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多