Javascript 如何将多个CSV文件合并到GDrive文件夹不同子文件夹下的单个文件中。?
我刚刚启动了谷歌应用程序脚本。我有一个文件夹,其中有不同的子文件夹,每个子文件夹包含至少一个csv文件。现在,我想从这些子文件夹中提取所有这些文件,并合并到单个google工作表中。我有一个函数可以遍历所有子目录并列出所有子文件夹,还有一个函数可以合并单个文件夹中的csv文件。现在我们有没有办法把这些函数结合起来,得到想要的结果。任何帮助都将不胜感激。多谢各位Javascript 如何将多个CSV文件合并到GDrive文件夹不同子文件夹下的单个文件中。?,javascript,csv,google-apps-script,Javascript,Csv,Google Apps Script,我刚刚启动了谷歌应用程序脚本。我有一个文件夹,其中有不同的子文件夹,每个子文件夹包含至少一个csv文件。现在,我想从这些子文件夹中提取所有这些文件,并合并到单个google工作表中。我有一个函数可以遍历所有子目录并列出所有子文件夹,还有一个函数可以合并单个文件夹中的csv文件。现在我们有没有办法把这些函数结合起来,得到想要的结果。任何帮助都将不胜感激。多谢各位 //////////////Merge all csv files in a Folder/////////////////////
//////////////Merge all csv files in a Folder/////////////////////
function mergeSheets() {
/* Retrieve the desired folder */
var myFolder = DriveApp.getFoldersByName("Apr_05_2013").next();
/* Get all spreadsheets that resided on that folder */
var spreadSheets = myFolder.getFilesByType("text/csv");
if (spreadSheets.hasNext()) {
/* Create the new spreadsheet that you store other sheets */
var newSpreadSheet = SpreadsheetApp.create("Merged Sheets");
var newSheet = newSpreadSheet.insertSheet("import_");
/* Iterate over the spreadsheets over the folder */
while(spreadSheets.hasNext()) {
var sheet = spreadSheets.next();
/* Load the csv data */
var csvData = Utilities.parseCsv(sheet.getBlob().getDataAsString(), ",");
/* Copy the sheet to the new merged Spread Sheet */
for (var i=0;i<csvData.length;i++) {
newSheet.appendRow(csvData[i]);
}
}
}
}
/////////////////**List all Sub folders which a folder contains**///////////////////////////
function genFolderTree() {
try {
var foldername = 'File2013';
var folderlisting = 'TreeView_' + foldername;
var parentFolder = DriveApp.getFoldersByName(foldername).next();
var ss = SpreadsheetApp.create(folderlisting);
var sheet = ss.getActiveSheet();
var frontCell = [];
sheet.appendRow([foldername]).getCurrentCell().setFontWeight('bold').setFontColor('red');
frontCell.push(" ");
getChildNode(parentFolder,sheet,frontCell);
var files = parentFolder.getFiles();
while (files.hasNext()) {
frontCell.push(files.next().getName());
sheet.appendRow( frontCell);
frontCell.pop();
}
} catch (e) {
Logger.log(e.toString());
}
}
function getChildNode(parent,sheet,frontCell) {
var childFolders = parent.getFolders();
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
frontCell.push(childFolder.getName())
sheet.appendRow(frontCell);
sheet.getRange(sheet.getLastRow(), frontCell.length).setFontWeight('bold').setFontColor('red');
frontCell.pop();
var files = childFolder.getFiles();
frontCell.push(" ");
var start_row = 0;
var row_no = 0;
while (files.hasNext()) {
frontCell.push(files.next().getName());
sheet.appendRow(frontCell);
if(row_no==0){
start_row = sheet.getLastRow();
}
row_no=row_no+1;
frontCell.pop();
}
if(row_no>0){
var range;
range = sheet.getRange(start_row, frontCell.length,row_no);
// The row grouping depth is increased by row_no.
range.shiftRowGroupDepth(1);
}
// Recursive call for any sub-folders
getChildNode(childFolder,sheet,frontCell);
frontCell.pop();
}
}
//合并文件夹中的所有csv文件/////////////////////
函数mergeSheets(){
/*检索所需的文件夹*/
var myFolder=DriveApp.getFoldersByName(“2013年4月5日”).next();
/*获取该文件夹中的所有电子表格*/
var spreadSheets=myFolder.getFilesByType(“text/csv”);
if(spreadSheets.hasNext()){
/*创建存储其他图纸的新电子表格*/
var newSpreadSheet=SpreadsheetApp.create(“合并表”);
var newSheet=newSpreadSheet.insertSheet(“导入”);
/*在文件夹上迭代电子表格*/
while(spreadSheets.hasNext()){
var sheet=电子表格。next();
/*加载csv数据*/
var csvData=Utilities.parseCsv(sheet.getBlob().getDataAsString(),“,”);
/*将工作表复制到新的合并电子表格*/
对于(var i=0;i0){
var范围;
范围=sheet.getRange(起始行、前单元格、长度、行号);
//行分组深度按行编号增加。
范围。移位组深度(1);
}
//对任何子文件夹的递归调用
getChildNode(childFolder、sheet、frontCell);
frontCell.pop();
}
}
递归子文件夹以合并CSV数据
此函数通过“主数据文件夹”的子文件夹递归,读取所有csv文件并将它们合并在一起,并将合并文件保存到“合并文件文件夹”中。您需要提供主数据文件夹id和合并文件文件夹id。它还会返回合并数据文件id并将其附加到活动工作表中
function loadMergeFile() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
sh.clearContents();
var data=Utilities.parseCsv(DriveApp.getFileById(mergeCSVs()).getBlob().getDataAsString());
data.forEach(function(r,i){sh.appendRow(r)});
}
function mergeCSVs() {
var mfldr=DriveApp.getFolderById('Merged File Folder Id');//merged data file saved in this folder
var folder=DriveApp.getFolderById('Main Data Folder Id');
var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"yyyyMMdd_HH:mm:ss")
var fn=Utilities.formatString('MergedCSV-%s',ts)
var mfile=mfldr.createFile(fn,'','text/csv');
getFnF(folder,mfile.getId());
return mfile.getId();//return the id so that the loadMergeFile can retrieve the data from the file.
}
function getFnF(folder,id) {
var mfile=DriveApp.getFileById(id);
var files=folder.getFilesByType(MimeType.CSV)
while(files.hasNext()) {
var file=files.next();
mfile.setContent(mfile.getBlob().getDataAsString() + file.getBlob().getDataAsString());
}
var subfolders=folder.getFolders()
while(subfolders.hasNext()) {
var subfolder=subfolders.next();
getFnF(subfolder,id);//The function calls itself as it moves into each subfolder
}
}
我使用以下函数创建了一些测试数据来测试上述函数。正如您所看到的,这些数据都是数字,并不复杂。因此,根据数据的复杂性,您可能需要进行一些调整
function createCSVsInFolders() {
var mainfldr=DriveApp.getFolderById('Main Data Folder Id');
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('csvdata');//set up test data in this sheet
var vA=sh.getDataRange().getValues();
var csv='';
vA.forEach(function(r,i){csv+=r.join(',') + '\r\n'});
Logger.log(csv);
var fldrA=['folder1','folder2','folder3','folder4'];
var fileA=['file1.csv','file2.csv','file3.csv','file4.csv'];
for(var i=0;i<fldrA.length;i++) {
var folder=mainfldr.createFolder(fldrA[i]);
for(var j=0;j<fileA.length;j++) {
folder.createFile(fileA[j],csv,MimeType.CSV)
}
}
}
函数createCsvInfolders(){
var mainfldr=DriveApp.getFolderById(“主数据文件夹Id”);
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('csvdata');//在此工作表中设置测试数据
var vA=sh.getDataRange().getValues();
var csv=“”;
vA.forEach(函数(r,i){csv+=r.join(',')+'\r\n'});
Logger.log(csv);
var fldrA=['folder1','folder2','folder3','folder4'];
var fileA=['file1.csv'、'file2.csv'、'file3.csv'、'file4.csv'];
对于(var i=0;i