迭代文件夹和子文件夹/文件并将电子表格数据复制到归档表 [英] Iterate through folders and sub-folders/files and copy spreadsheet data to archive sheet
问题描述
我有一个脚本遍历一个文件夹,打开所有的电子表格,并将这些表格的特定数组/范围复制到一个档案表。我的脚本功能很好[在包含文件的文件夹上],但我无法弄清楚如何让脚本遍历子文件夹。
我知道我最终会遇到超时问题。但是我会考虑设置一个令牌,让它继续停止,直到它能够遍历整个文件夹结构。 (所以现在不是问题。)
我的文件夹结构的一个例子如下:
任何帮助你们可以给我,将不胜感激!
感谢,
布兰登
$ b
函数runDataReport(){
var folder = DriveApp.getFolderById(ID);
Logger.log('folder:'+文件夹);
var sheetFiles = folder.getFilesByType(application / vnd.google-apps.spreadsheet);
Logger.log(sheetFiles.hasNext():+ sheetFiles.hasNext());
var data; (sheetFiles.hasNext()){
var file = sheetFiles.next();
while(sheetFiles.hasNext())
var theFileType = file.getMimeType();
Logger.log(theFileType:+ theFileType);
var ssID = file.getId();
Logger.log('ssID:'+ ssID);
var thisSS = SpreadsheetApp.openById(ssID),
ssName = thisSS.getName(),
ssUrl = thisSS.getUrl(),$ b $ classData = thisSS。 getSheets()[0],
dataLastRow = classData.getLastRow(),
Avals = classData.getRange(A1:A)。getValues(),
Alast = Avals.filter String).length,
Jvals = classData.getRange(J2:J)。getValues(),
Jlast = Jvals.filter(String).length,$ b $ classDataRange = classData.getRange (3,1,Alast-2,50),
dataArray = classDataRange.getValues();
var dataReportSS = SpreadsheetApp.openById('ID'),// Data Report Sheet ID
dataReportSheet = dataReportSS.getSheets()[0],
dataReportNewRow = dataReportSheet.getLastRow ()+ 1,
newDataRange = dataReportSheet.getRange(dataReportNewRow,3,Alast-2,50);
if(Jlast> 1){
newDataRange.setValues(dataArray); (var i = 0,x = dataArray.length; i< x; i ++){
dataReportSheet.getRange(dataReportNewRow + i,1).setValue(ssName);
。 (var i = 0,x = dataArray.length; i< x; i ++){
dataReportSheet.getRange(dataReportNewRow + i,2).setValue(ssUrl);
}
;
code
解决方案这是我希望为你工作的一些代码。
函数runDataReport(){
我没有测试它,所以让我知道是否有任何问题。 var allFoldersInThisDrive = DriveApp.getFolders();
var foldersToExclude = [folder1,folder2,folder3];
while(allFoldersInThisDrive.hasNext()){
var folder = allFoldersInThisDrive.next();
//Logger.log(allFoldersInThisDrive.getName());
var thisFolderName = folder.getName();
//如果index是-1,那么在文件夹中找不到这个文件夹来排除
if(foldersToExclude.indexOf(thisFolderName)=== - 1){
/ /分支到另一个函数,以便通过此文件夹中的所有文件进行交互
processAllFiles(folder)
};
};
函数processAllFiles(argFolder){
var sheetFiles = argFolder.getFilesByType(application / vnd.google-apps.spreadsheet);
Logger.log(sheetFiles.hasNext():+ sheetFiles.hasNext());
var data; (sheetFiles.hasNext()){
var file = sheetFiles.next();
while(sheetFiles.hasNext())
var theFileType = file.getMimeType();
Logger.log(theFileType:+ theFileType);
var ssID = file.getId();
Logger.log('ssID:'+ ssID);
var thisSS = SpreadsheetApp.openById(ssID),
ssName = thisSS.getName(),
ssUrl = thisSS.getUrl(),$ b $ classData = thisSS。 getSheets()[0],
dataLastRow = classData.getLastRow(),
Avals = classData.getRange(A1:A)。getValues(),
Alast = Avals.filter String).length,
Jvals = classData.getRange(J2:J)。getValues(),
Jlast = Jvals.filter(String).length,$ b $ classDataRange = classData.getRange (3,1,Alast-2,50),
dataArray = classDataRange.getValues();
$ b $ var dataReportSS = SpreadsheetApp.openById('The ID here'),// Data Report Sheet ID
dataReportSheet = dataReportSS.getSheets()[0],
dataReportNewRow = dataReportSheet .getLastRow()+ 1,
newDataRange = dataReportSheet.getRange(dataReportNewRow,3,Alast-2,50);
if(Jlast> 1){
newDataRange.setValues(dataArray); (var i = 0,x = dataArray.length; i< x; i ++){
dataReportSheet.getRange(dataReportNewRow + i,1).setValue(ssName);
。 (var i = 0,x = dataArray.length; i< x; i ++){
dataReportSheet.getRange(dataReportNewRow + i,2).setValue(ssUrl);
}
;
}
}
}
};
I have a script that iterates through a folder, opens all spreadsheets, and copies a certain array/range of these sheets to an archive sheet. My script functions just fine [on Folders containing files], but I can't figure out how to get my script to iterate through sub-folders as well.
I know that I'm going to have time-out issues eventually. But I'm going to look at setting up a token to have it continue where it left off once I can get it to iterate through the whole folder structure. (So not a problem for now.)
An example of my folder structure is as follows:
- Master Folder
- ---Teacher Name (Folder)
- -----Reading Assessment Data (Folder)
- -------Spreadsheet
- -------Spreadsheet
- -------Spreadsheet
- -----Math Assessment Data (Folder)
- -------Spreadsheet
- -------Spreadsheet
- -------Spreadsheet
- ---Teacher Name (Folder)
- -----This Continues...
Any help you guys can give me would be greatly appreciated!
Thanks,
Brandon
function runDataReport () {
var folder = DriveApp.getFolderById("ID");
Logger.log('folder: ' + folder);
var sheetFiles = folder.getFilesByType("application/vnd.google-apps.spreadsheet");
Logger.log("sheetFiles.hasNext(): " + sheetFiles.hasNext());
var data;
while (sheetFiles.hasNext()) {
var file = sheetFiles.next();
var theFileType = file.getMimeType();
Logger.log("theFileType: " + theFileType);
var ssID = file.getId();
Logger.log('ssID: ' + ssID);
var thisSS = SpreadsheetApp.openById(ssID),
ssName = thisSS.getName(),
ssUrl = thisSS.getUrl(),
classData = thisSS.getSheets()[0],
dataLastRow = classData.getLastRow(),
Avals = classData.getRange("A1:A").getValues(),
Alast = Avals.filter(String).length,
Jvals = classData.getRange("J2:J").getValues(),
Jlast = Jvals.filter(String).length,
classDataRange = classData.getRange(3, 1, Alast-2, 50),
dataArray = classDataRange.getValues();
var dataReportSS = SpreadsheetApp.openById('ID'), //Data Report Sheet ID
dataReportSheet = dataReportSS.getSheets()[0],
dataReportNewRow = dataReportSheet.getLastRow() + 1,
newDataRange = dataReportSheet.getRange(dataReportNewRow, 3, Alast-2, 50);
if (Jlast > 1){
newDataRange.setValues(dataArray);
for (var i=0, x = dataArray.length; i<x; i++){
dataReportSheet.getRange(dataReportNewRow + i, 1).setValue(ssName);
}
for (var i=0, x = dataArray.length; i<x; i++){
dataReportSheet.getRange(dataReportNewRow + i, 2).setValue(ssUrl);
}
}
}
}
解决方案 Here is some code that I hope works for you. I didn't test it, so let me know if there are any problems.
function runDataReport () {
var allFoldersInThisDrive = DriveApp.getFolders();
var foldersToExclude = ["folder1","folder2","folder3"];
while (allFoldersInThisDrive.hasNext()) {
var folder = allFoldersInThisDrive.next();
//Logger.log(allFoldersInThisDrive.getName());
var thisFolderName = folder.getName();
//If index is -1, then thisFolderName was not found in the folders to exclude
if (foldersToExclude.indexOf(thisFolderName)===-1) {
//branch to another function in order to interate through all the files in this folder
processAllFiles(folder)
};
};
}
function processAllFiles(argFolder) {
var sheetFiles = argFolder.getFilesByType("application/vnd.google-apps.spreadsheet");
Logger.log("sheetFiles.hasNext(): " + sheetFiles.hasNext());
var data;
while (sheetFiles.hasNext()) {
var file = sheetFiles.next();
var theFileType = file.getMimeType();
Logger.log("theFileType: " + theFileType);
var ssID = file.getId();
Logger.log('ssID: ' + ssID);
var thisSS = SpreadsheetApp.openById(ssID),
ssName = thisSS.getName(),
ssUrl = thisSS.getUrl(),
classData = thisSS.getSheets()[0],
dataLastRow = classData.getLastRow(),
Avals = classData.getRange("A1:A").getValues(),
Alast = Avals.filter(String).length,
Jvals = classData.getRange("J2:J").getValues(),
Jlast = Jvals.filter(String).length,
classDataRange = classData.getRange(3, 1, Alast-2, 50),
dataArray = classDataRange.getValues();
var dataReportSS = SpreadsheetApp.openById('The ID here'), //Data Report Sheet ID
dataReportSheet = dataReportSS.getSheets()[0],
dataReportNewRow = dataReportSheet.getLastRow() + 1,
newDataRange = dataReportSheet.getRange(dataReportNewRow, 3, Alast-2, 50);
if (Jlast > 1){
newDataRange.setValues(dataArray);
for (var i=0, x = dataArray.length; i<x; i++){
dataReportSheet.getRange(dataReportNewRow + i, 1).setValue(ssName);
}
for (var i=0, x = dataArray.length; i<x; i++){
dataReportSheet.getRange(dataReportNewRow + i, 2).setValue(ssUrl);
}
}
}
};
这篇关于迭代文件夹和子文件夹/文件并将电子表格数据复制到归档表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!