将多个 xlsx 文件组合成一个 google sheet for datastudio

Combining multiple xlsx files into a single google sheet for datastudio

我有一个文件夹将接收多个 xlsx 文件,这些文件将通过 Google 表单上传。每周会添加几次新的 sheet,需要添加这些数据。

我想将所有这些 xlsx 文件转换成一个 sheet 以供数据工作室使用。

我已经开始使用这个脚本:

    function myFunction() {
   //folder ID
   var folder = DriveApp.getFolderById("folder ID");
   
   var filesIterator = folder.getFiles();
   var file;
   var filetype;
   var ssID;
   var combinedData = [];
   var data;



   while(filesIterator.hasNext()){
     file = filesIterator.next();
     filetype = file.getMimeType();
     if (filetype === "application/vnd.google-apps.spreadsheet"){
       ssID = file.getId();
       data = getDataFromSpreadsheet(ssID)
       combinedData = combinedData.concat(data);
     }//if ends here
   }//while ends here
   Logger.log(combinedData.length);
 }




 function getDataFromSpreadsheet(ssID) {

   var ss = SpreadsheetApp.openById(ssID);
   var ws = ss.getSheets()[0];
   var data = ws.getRange("A:W" + ws.getLastRow()).getValues();
 return data;

 }

不幸的是,该数组返回 0!我认为这可能是由于 xlsx 问题。

1。获取 excel 数据

遗憾的是,Apps 脚本无法直接处理 excel 值。您需要先将这些文件转换为 Google 表格才能访问数据。这很容易做到,并且可以使用 Drive API(您可以在此处查看文档)和代码顶部的以下两行来完成。

var filesToConvert = DriveApp.getFolderById(folderId).getFilesByType(MimeType.MICROSOFT_EXCEL);
while (filesToConvert.hasNext()){ Drive.Files.copy({mimeType: MimeType.GOOGLE_SHEETS, parents: [{id: folderId}]}, filesToConvert.next().getId());}

请注意,这会通过创建 excel 的 Google 表格副本来复制现有文件,但不会删除 excel 文件本身。另请注意,您需要激活 Drive API 服务。

2。从 combinedData

中删除重复项

这不像从常规数组中删除重复项那么简单,因为 combinedData 是一个数组数组。然而,它可以通过创建一个中间对象来完成,该对象将行数组的字符串化版本存储为键,将行数组本身存储为值:

var intermidiateStep = {};
combinedData.forEach(row => {intermidiateStep[row.join(":")] = row;})
var finalData = Object.keys(intermidiateStep).map(row=>intermidiateStep[row]);

额外

我还在你的代码中发现了另一个错误。你应该在声明要读取的值的范围时添加一个 1 (或者你想要读取的第一行是哪个),所以

var data = ws.getRange("A1:W"+ws.getLastRow()).getValues();

而不是:

var data = ws.getRange("A:W" + ws.getLastRow()).getValues();

按照目前的情况,Apps 脚本无法理解您想要读取的确切范围,只是假设它是整个页面。