getRange 变量范围

getRange variable range

我正在尝试使用 google sheet 对元素列表进行排名。此列表不断更新,因此如果我已经对数百个元素进行排名并且需要对 10 个新元素进行排名,则更新列表可能会很麻烦。我认为编写一个可以为我重新排名的宏更容易,而不是每次都必须重新排名一些以前排名的元素(无论是手动还是使用公式)。

1 - 元素 A

2 - 元素 B

3 - 元素 C

新元素:元素D

例如,如果我想让元素 D 排在第二位,我需要将元素 B 更改为 3,将元素 C 更改为 4。当处理数百个元素时,这很乏味。

到目前为止,这是我的代码,但我被 getRange 行卡住了。排名在 A 列。

 function RankElements() { 

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = s.getActiveCell();
  var v1 = r.getValue();
  var v2 = v1 + 1 
  var v3 = v2 + 1
  var lastRow = s.getLastRow();
  s.getRange(1,v2).setValue(v2);
  s.getRange(1,v3).autoFill(s.getRange(1,v3+":"+1,lastRow), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  s.getRange(1,v3+":"+1,lastRow).copyTo(s.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  s.getFilter().sort(1, true);
};

您可以执行以下操作:

  • 遍历 A 列中的所有值。
  • 对于每个值,检查 (1) 排名是否等于或低于新排名,以及 (2) 它不是要添加的元素。
  • 如果这两个条件都满足,则将1添加到当前排名。

可能是这样的:

function RankElements() { 
  const sheet = SpreadsheetApp.getActiveSheet();
  const cell = sheet.getActiveCell();
  const row = cell.getRow();
  const newRanking = sheet.getActiveCell().getValue();
  const firstRow = 2;
  const columnA = sheet.getRange(firstRow, 1, sheet.getLastRow() - 1).getValues()
                       .map(row => row[0]); // Retrieve column A values
  for (let i = 0; i < columnA.length; i++) { // Iterate through column A values
    if (columnA[i] >= newRanking && (i + firstRow) != row) {
      sheet.getRange(firstRow + i, 1).setValue(columnA[i] + 1); // Add 1 to ranking
    }
  }
  sheet.getFilter().sort(1, true);
};