javascript - 优化 Google Apps 脚本中的 for 循环函数(可能是数组)?

标签 javascript arrays for-loop google-apps-script google-sheets

这里是第一次海报。我想了解一些我认为可以稍微修饰一下的 Google App Script 代码。

长话短说。

我有 2 个 Google Sheet 表格

  • “LOCALE”电子表格 - 列出位置的唯一名称

  • “FEED”电子表格 - 列出照片描述,包括位置。此电子表格中多次列出同一位置。

  • 这两个表都有一个“位置”列,该列通过相互引用专栏。

我想解决的问题:

当我在“LOCALE”电子表格中编辑位置名称时,它应该会自动更新“FEED”电子表格中的所有位置名称。

我解决这个问题的方法:

为此,我在 for 循环中使用了 for 循环。总结一下:

  • 对于“LOCALE”中的每一行...
  • ..遍历“FEED”中的每一行...
  • ...如果FEED表中Key列中的值与表中Key列中的值匹配LOCALE 工作表...
  • ...但是 FEED 表中 Location 列中的值与表中 Location 列中的值不匹配LOCALE工作表...
  • ...使用LOCALE位置列中的值更新FEED表中的位置列em> 表。

如果您还没有感到困惑,这是我为其编写的代码:

// for each row in the "Locale" sheet... 
for(var L = LocationsRefValues.length-1;L>=0;L--) {

  // for each row in the "Feed" sheet...
  for(var F = FeedRefValues.length-1;F>=0;F--) {

    if (FeedRefValues[F][97] == LocationsRefValues[L][17] && 
        FeedRefValues[F][10] != LocationsRefValues[L][1]) {
       FeedDataSheet.getRange(F+2,10+1).setValue(LocationsRefValues[L][1]);
    }       
  }
}

现在,这段代码工作得很好,我没有遇到任何问题。然而,我觉得这有点笨拙,因为需要一段时间才能完成编辑。我确信有更简单的方法可以编写并运行此代码。我听说数组可以解决这种情况,但我不知道如何解决。因此,这就是我寻求帮助的原因。有人可以帮忙吗?

请记住,我是一个完全的 Google App 脚本初学者,我完全是靠运气才得到这段代码的,所以解决方案越简单越好。感谢您提前考虑我的问题。期待收到大家的来信。

这是完整的功能(在我进行此处建议的编辑后。)

   function ModeratorStatus() {

  var Data = SpreadsheetApp.getActiveSpreadsheet(); // Local Spreadsheet

  var ModeratorStatusDataSheet = Data.getSheetByName("The Status (Moderators)");
  var ModeratorStatusRange = ModeratorStatusDataSheet.getRange("A2:C");
  var ModeratorStatusRefValues = ModeratorStatusRange.getValues();

 var ModeratorDataSheet = Data.getSheetByName("The Moderator_Numbers");  // DATA "Member" sheet
  //var ModeratorRefValues = ModeratorDataSheet.getRange("A2:AD").getValues();

  var ModeratorStatusObj = {};
for (var MOS = ModeratorStatusRefValues.length-1; MOS>=0; MOS--) {
  ModeratorStatusObj[ModeratorStatusRefValues[MOS][2]] = ModeratorStatusRefValues[MOS][0];
}
  var ModeratorValues = ModeratorDataSheet.getRange("A1:AD").getValues();
for (var MO = ModeratorValues.length-1; MO >=0; MO--) { // for each row in the "Moderator" sheet...
  var ModeratorVal28 = ModeratorValues[MO][28];
  if (ModeratorStatusObj[ModeratorVal28] != ModeratorValues[MO][1]) {

    ModeratorValues[MO][1] = ModeratorStatusObj[ModeratorVal28];
  }
}
var destinationRange = ModeratorDataSheet.getRange(1, 1, ModeratorValues.length, ModeratorValues[0].length);
destinationRange.setValues(ModeratorValues);

我在不同的函数中使用了代码作为测试。为了让事情变得更容易

区域设置 = 版主状态

提要=主持人

最佳答案

如果 LocationsRefValues 中不存在具有不同 [1] 的重复 [17],您可以通过预先为 LocationsRefValues 创建映射对象(其键),将计算复杂度从 O(n ^ 2) 降低到 O(n)LocationsRefValues[L][17],其值为 LocationsRefValues[L][1]:

var locationObj = {};
for (var L = 0; L < LocationsRefValues.length; L++) {
  locationObj[LocationsRefValues[L][17]] = LocationsRefValues[L][1];
}
for (var F = FeedRefValues.length - 1; F >= 0; F--) { // for each row in the "Feed" sheet...
  var feedVal97 = FeedRefValues[F][97];
  if (locationObj[feedVal97] != FeedRefValues[F][10]) {
    FeedDataSheet.getRange(F + 2, 10 + 1).setValue(locationObj[feedVal97]);
  }
}

感谢@TheMaster,您可以通过在最后调用 setValue 一次来加快速度,而不是在循环中调用它,可能类似于:

var locationObj = {};
for (var L = 0; L < LocationsRefValues.length; L++) {
  locationObj[LocationsRefValues[L][17]] = LocationsRefValues[L][1];
}
var feedValues = FeedDataSheet.getValues();
for (var F = FeedRefValues.length - 1; F >= 0; F--) { // for each row in the "Feed" sheet...
  var feedVal97 = FeedRefValues[F][97];
  if (locationObj[feedVal97] != FeedRefValues[F][10]) {
    feedValues[F + 2][10 + 1] = locationObj[feedVal97];
  }
}
var destinationRange = ss.getRange(1, 1, feedValues.length, feedValues[0].length);
destinationRange.setValues(feedValues);

关于javascript - 优化 Google Apps 脚本中的 for 循环函数(可能是数组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59657993/

相关文章:

c# - C# 中的简单循环(移动平均)数组

c - 打印结构数组

具有矩阵和向量的 R 循环 : better (faster) solutions?

使用 for 循环的 JavaScript 倒计时

java - 读取用户输入时如何使用 boolean 变量

javascript - 仅使用 Array.push 时数组中未初始化的变量?

javascript - 如何在 css/js 中显示点击?

java - matlab中大小的java表示是什么

javascript - 在 Javascript 中将图像转换为 RGB 数组

javascript - html 输入标签在 Javascript 中总是读取 null