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

标签 javascript arrays google-apps-script

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

相关文章:

javascript - 如何根据另一个数组的匹配键值对返回一个数组?

javascript - 在 Google Apps 脚本中连接字符串

html - 需要 Google Apps 脚本和脚本数据库替换示例

javascript - 如何将 span 标签中的数据动态添加到 href 标签中

javascript - 在 ./directory testcafe 中保存屏幕截图

javascript - 在 React 中获取关键 Prop 警告,即使组件没有重复

javascript - 如何禁用鼠标中键单击超链接在新选项卡或新窗口中打开?

arrays - 在 Swift 中读取 .txt 文件的性能下降

javascript - JavaScript 中的不可变对象(immutable对象)和集合

javascript - 有没有办法将基于 Javascript 的签名板添加到 Google 表单以捕获响应者的签名?