优化谷歌应用脚本中的for循环功能(也许是数组)?



这是第一次发海报。我想对一些谷歌应用脚本代码有一些见解,我认为可以稍微修饰一下。

长话短说。

我有 2 个谷歌表格

  • "区域设置"电子表格 - 列出位置的唯一名称

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

  • 这两个表都有一个">位置"列,该列使用"键"列相互引用。

我想解决的问题:

当我在"区域设置"电子表格中编辑位置名称时,它应该自动更新"FEED"电子表格中的所有位置名称。

我解决这个问题的方法:

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

  • 对于">区域设置"中的每一行...
  • ..遍历">提要"中的每一行...
  • 。如果表中"键"列中的值与">区域设置表"中"键"列中的值匹配...
  • 。但FEED表中"位置"列中的值与">区域设置"表中">位置"列中的值不匹配...
  • 。使用区域设置表中">位置"列中的值更新表中的">位置"列。

如果你还不困惑,这是我为它编写的代码:

// 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 Script初学者,他通过纯粹的运气让这段代码工作,所以解决方案越简单越好。感谢您提前考虑我的问题。期待大家的来信。

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

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]s,其值是LocationsRefValues[L][1]s:

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);

您可以使用onEdit(e)触发器来获取对已编辑单元格的引用。在这种情况下,您无需遍历整个"语言环境"表:

function onEdit(e) {
var range = e.range; // edited cell
var rowIndex = range.getRow()
var colIndex = range.getColumn()
if (rowIndex >= LocaleRange.startRow && rowIndex <= LocaleRange.EndRow && 
colIndex >= LocaleRange.startColumn && colIndex <= LocaleRange.EndColumn) {
var index = rowIndex - LocaleRange.startRow
var keyValue = LocationsRefValues[index][17]
var newLocValue = range.getValue()
var newFeedValues = FeedRefValues.map(function (row) {
return (row[97] == keyValue)  newLocValue ? : row[10]
})
FeedDataRange.setValues(newFeedValues)
}
}

以下是有关使用 onEdit 触发器的文档:https://developers.google.com/apps-script/guides/triggers

最新更新