Javascript 何处/如何设置循环增量并仅在找到条件时更新数组?
我正在编写一个函数来遍历Google Drive上的文件夹,并使用变量字符串(表单元格中指定的日期)匹配文件(Google工作表)。找到匹配的文件后,包含的文件夹名称字符串将分配给folderItems[0],文件URL将分配给folderItems[1]。找到文件夹中的所有匹配文件后,将以相同的方式遍历下一个文件夹。这些“folderItems”数组存储在父数组“folderItemsContainer”中,以创建二维数组,然后可以使用.setValues()将其输出到电子表格 我很难弄清楚如何或在何处放置增量变量,这样它只会在文件名匹配时递增,而不会在找不到匹配时停止循环 我尝试过各种结构,包括交换for和while循环,以及在看似有用的地方插入if语句。我已经看过了一些关于Stackoverflow的不同答案,这些答案接近合理,但似乎都不适用于这里。我对编程相当陌生。我已经尝试了不同的代码变体,但到目前为止,我的目标是:Javascript 何处/如何设置循环增量并仅在找到条件时更新数组?,javascript,arrays,google-apps-script,Javascript,Arrays,Google Apps Script,我正在编写一个函数来遍历Google Drive上的文件夹,并使用变量字符串(表单元格中指定的日期)匹配文件(Google工作表)。找到匹配的文件后,包含的文件夹名称字符串将分配给folderItems[0],文件URL将分配给folderItems[1]。找到文件夹中的所有匹配文件后,将以相同的方式遍历下一个文件夹。这些“folderItems”数组存储在父数组“folderItemsContainer”中,以创建二维数组,然后可以使用.setValues()将其输出到电子表格 我很难弄清楚如
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);
*/
}
函数GetFolderData(){
var currentSheet=SpreadsheetApp.getActiveSpreadsheet();
var currentYearPeriod=currentSheet.getRange(“C1!A4”).getValue();
//Logger.log(当前年份期间);
//从父文件夹获取文件夹对象
var parentFolderId=“17F0FCBH0JMXSK2SUQ723UIY0E2G_u0m”;
var parentFolder=DriveApp.getFolderById(parentFolderId);
//从指定的父文件夹获取文件夹
var StaffFolders=parentFolder.getFolders();
//创建容器数组
var folderItemsContainer=[];
//创建项目数组
var folderItems=[];
var i=0;
//对于每个员工文件夹,无论其内容如何,请执行以下操作:
while(StaffFolders.hasNext()){
//获取当前文件夹对象
currentFolder=StaffFolders.next();
//以FileIterator的形式获取当前文件夹对象中的文件
FolderFiles=currentFolder.getFiles();
//如果文件夹为空,则外部while循环将迭代
if(FolderFiles!==null){
//遍历现有文件
while(FolderFiles.hasNext()){
//按顺序获取文件对象
file=FolderFiles.next();
//当文件名与currentYearPeriod匹配时,将URL存储在folderItems中名称旁边
对于(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];
}
}
}
}
返回folderItemsContainer;
}
函数InsertFolderData(){
var sheet=SpreadsheetApp.getActiveSheet();
sheet.getRange(“B4:Z1000”).clearContent();
FolderData=GetFolderData();
Logger.log(FolderData);
床单
.getRange(4,2,FolderData.length,FolderData[0].length)
.设置值(FolderData);
Logger.log(FolderData);
/*var str=“”;
对于(var i=0;i对于上面的代码,我不完全确定为什么,但我似乎陷入了一个无休止的循环,脚本没有完成。我希望实现的是,folderItemsContainer数组填充了包含与currentYearPeriod变量匹配的文件信息(父文件夹名称[0]和文件URL[1])的数组。我一直在重构代码,我学到了很多东西,但不幸的是没有学会如何解决这个问题。你的for循环。下面是for循环的语法
for (statement 1; statement 2; statement 3) {
// code block to be executed
}
语句1在执行代码块之前执行(一次)
语句2定义了执行代码块的条件
语句3(每次)在代码块执行后执行
for循环没有定义退出的条件。最小值或最大值。差不多
i<file.getName().indexOf(currentYearPeriod);
i您应该检查每个循环之间的差异,因为您没有完全解开它们。如果要在for循环中执行指令直到满足特定条件,在本例中,file.getName().indexOf(currentYearPeriod)!=-1
,您应该使用while循环。错误在于,以前的条件从未满足,因为在运行for
循环时,file
从未更改。这就是为什么你有一个无限循环。我的解决方案:
// 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;
}
循环之间的差异:
用于循环
当您知道需要多少次迭代时,可以使用它们。例如,如果要在控制台中打印字符串的所有字符:
const str = "hello";
for(let i = 0; i < str.length; i++) {
console.log(str.charAt(i));
}
非常感谢您对此进行解释并提供示例代码。出于我的目的,我需要对它进行一些调整,但我学到了while循环和递增的经验,这帮助我解决了这个问题。我会在这里发布工作代码以帮助其他人,但字符限制不允许这样做。再次感谢。我很高兴它帮助了你。
function getFirstL(str)
let i = 0;
while(i < str.length && str.charAt(i) !== "l"){
i++;
}
}