gpt4 book ai didi

javascript - 在哪里/如何设置循环增量并仅在找到条件时更新数组?

转载 作者:行者123 更新时间:2023-11-30 11:01:12 25 4
gpt4 key购买 nike

我正在编写一个函数来遍历 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com