Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 何处/如何设置循环增量并仅在找到条件时更新数组?_Javascript_Arrays_Google Apps Script - Fatal编程技术网

Javascript 何处/如何设置循环增量并仅在找到条件时更新数组?

Javascript 何处/如何设置循环增量并仅在找到条件时更新数组?,javascript,arrays,google-apps-script,Javascript,Arrays,Google Apps Script,我正在编写一个函数来遍历Google Drive上的文件夹,并使用变量字符串(表单元格中指定的日期)匹配文件(Google工作表)。找到匹配的文件后,包含的文件夹名称字符串将分配给folderItems[0],文件URL将分配给folderItems[1]。找到文件夹中的所有匹配文件后,将以相同的方式遍历下一个文件夹。这些“folderItems”数组存储在父数组“folderItemsContainer”中,以创建二维数组,然后可以使用.setValues()将其输出到电子表格 我很难弄清楚如

我正在编写一个函数来遍历Google Drive上的文件夹,并使用变量字符串(表单元格中指定的日期)匹配文件(Google工作表)。找到匹配的文件后,包含的文件夹名称字符串将分配给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);

  */
}
函数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++;
   }
}