getRange变量范围

问题描述 投票:0回答:1

我正在尝试使用Google表格对元素列表进行排名。此列表会不断更新,因此如果我已经对数百个元素进行排名并且需要对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);
};
google-sheets ranking
1个回答
1
投票

您可以执行以下操作:

  • 迭代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);
};
© www.soinside.com 2019 - 2024. All rights reserved.