Повторяющиеся подпапки для объединения данных CSV
Эта функция рекурсивно просматривает подпапки «Основной папки данных» и считывает все файлы CSV, объединяет их вместе и сохраняет объединенный файл. в «Объединенную папку файлов». Вам нужно будет указать идентификатор основной папки данных и идентификатор папки объединенного файла. Он также возвращает объединенный идентификатор файла данных и добавляет его в активный лист.
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)
}
}
}
Лист csvdata: