将多个 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 脚本无法理解您想要读取的确切范围,只是假设它是整个页面。
我有一个文件夹将接收多个 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 脚本无法理解您想要读取的确切范围,只是假设它是整个页面。