我正在编写一个函数来遍历 Google Drive 上的文件夹并使用可变字符串(表格单元格上指定的日期)匹配文件 (Google Sheets)。找到匹配文件后,包含的文件夹名称字符串会分配给 folderItems[0],文件 URL 会分配给 folderItems[1]。找到文件夹中的所有匹配文件后,将以相同方式遍历下一个文件夹。这些“folderItems”数组存储在父数组“folderItemsContainer”中以创建一个二维数组,然后可以使用 .setValues() 将其输出到电子表格。
我无法弄清楚如何或在哪里放置增量变量,以便它只会在文件名匹配时递增,但在找不到匹配时不会停止循环。
我尝试过各种结构,包括互换 for 和 while 循环以及在看似有用的地方插入 if 语句。我在 Stackoverflow 上查看了几个不同的答案,这些答案接近合理,但似乎都不适用于此处。我对编程还很陌生。我已经尝试过不同的代码变体,但这是我到目前为止所做的:
function GetFolderData() {
var currentSheet = SpreadsheetApp.getActiveSpreadsheet();
var currentYearPeriod = currentSheet.getRange("C1!A4").getValue();
// Logger.log(currentYearPeriod);
//Get folder objects from parent folder
var parentFolderId = "17F0fcBH0jmxsk2sUq723AuIY0E2G_u0m";
var parentFolder = DriveApp.getFolderById(parentFolderId);
//Get folders from specified parent folder
var StaffFolders = parentFolder.getFolders();
//Create container array
var folderItemsContainer = [];
//Create Item Array
var folderItems = [];
var i = 0;
//For every staff folder, regardless of content, do:
while (StaffFolders.hasNext()) {
//Get current folder object
currentFolder = StaffFolders.next();
//Get files in current folder object as FileIterator
FolderFiles = currentFolder.getFiles();
//If folder empty, outer while loop will iterate
if (FolderFiles !== null) {
//Iterate through existing files
while (FolderFiles.hasNext()) {
//Get file object sequentially
file = FolderFiles.next();
//When filename matches currentYearPeriod, store URL next to name in folderItems
for (i = 0; file.getName().indexOf(currentYearPeriod) !== -1; i++) {
folderItems[i] = [];
folderItems[i][0] = currentFolder.getName();
// Logger.log(currentFolder.getName());
folderItems[i][1] = file.getUrl();
folderItemsContainer[i] = folderItems[i];
}
}
}
}
return folderItemsContainer;
}
function InsertFolderData() {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange("B4:Z1000").clearContent();
FolderData = GetFolderData();
Logger.log(FolderData);
sheet
.getRange(4, 2, FolderData.length, FolderData[0].length)
.setValues(FolderData);
Logger.log(FolderData);
/* var str = "";
for (var i = 0; i < FolderData.length; i++) {
str += FolderData[i] + "\r\n";
}
str = str.substr(0);
var ui = SpreadsheetApp.getUi();
ui.alert("DATA IMPORTED: " + "\r\n" + str);
*/
}
对于上面的代码,我不完全确定为什么,但我似乎陷入了无限循环并且脚本没有完成。我希望实现的是用包含与 currentYearPeriod 变量匹配的文件的文件信息(父文件夹名称 [0] 和文件 URL [1])的数组填充 folderItemsContainer 数组。我一直在重构代码,我学到了很多东西,但不幸的是,我没有学到如何解决问题。
最佳答案
您应该检查每个循环之间的区别是什么,您并没有完全取消对它们的理解。如果要执行 for 循环内的指令直到满足特定条件,在本例中为 file.getName().indexOf(currentYearPeriod) !== -1
,你应该使用一个 while 循环。错误是以前的条件永远不会满足,因为 file
运行 for
时永远不会改变环形。这就是为什么你有一个无限循环。我的解决方案:
// new variable
var cnt = 0;
while (StaffFolders.hasNext()) {
currentFolder = StaffFolders.next();
FolderFiles = currentFolder.getFiles();
if (FolderFiles !== null) {
while (FolderFiles.hasNext()) {
file = FolderFiles.next();
// You for loop started here
folderItems[cnt] = [];
folderItems[cnt][0] = currentFolder.getName();
folderItems[cnt][1] = file.getUrl();
folderItemsContainer[cnt] = folderItems[cnt];
// each time you read a new file you increment by 1
cnt++;
}
}
// this reset the counter for each new folder
cnt = 0;
}
循环之间的引用:
for 循环
当您知道需要多少次迭代时使用它们。例如,如果你想在控制台打印一个字符串的所有字符:
const str = "hello";
for(let i = 0; i < str.length; i++) {
console.log(str.charAt(i));
}
-
let i = 0
是起点 -
i < str.length
是你想停下来的时候。如果您必须使用不是以下之一的符号<, <=, >, >=
, 你不应该使用for
循环。 -
i++
您想如何到达停靠点。
while 循环
如果您不知道循环何时结束,它是否会有 5 次迭代、100 次迭代或 0 次迭代。你应该使用 while
循环。
function getFirstL(str)
let i = 0;
while(i < str.length && str.charAt(i) !== "l"){
i++;
}
}
关于javascript - 在哪里/如何设置循环增量并仅在找到条件时更新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57639067/