在 Google Sheet 宏语言中移动 "active" 个单元格

Move "active" cell in Googles Sheet macro language

我正在尝试编写一个函数,从某个 row/column 开始的 sheet 中提取第 n 个(在示例中为第 4 个)列数据,其地址被定义为一个变量。我尝试使用 offset 但 .getrange() 将 "active" 单元格移动到第 n 个位置并使该单元格成为活动单元格但宏中止。有没有人这样做过?由于数据的性质,我将 "active" 单元格移动 n 列很重要。下面的代码子集:

function PullSelectedData() {

//

var GeneralDataFirstLocation = "D4";   //data starting point cell D4

var ColumnsBetweenSeries = 4;          //want data from each of the 4 columns (e.g.; D4, H4, L4, P4....)

var ReturnedValue = 0;

//

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

var BondCheckSS = spreadsheet.getSheetByName("BONDCHECKSHEET");

//

  for (var i = 0; i <= 3; i++) {

      BondCheckSS.getRange(GeneralDataFirstLocation).Offset(0, ColumnsBetweenSeries * i).activate();

      ReturnValue = getActiveCell().getValue();

  }

}

为什么会崩溃

  • 第一个问题是 Offset 不是一个函数,所以它应该是 offset,虽然你对函数的参数是正确的,所以这个问题已经解决了。
  • 下一个问题是 getActiveCell 本身不是一个函数,它必须在 sheet 上调用。例如,MySheet.getActiveCell()
  • 不会导致代码崩溃但允许您使用 ColumnsBetweenSeries 变量的第三个问题是将循环更改为 for (var i = 0; i < ColumnsBetweenSeries; i++) {

不需要的行为

至此,您的代码现在运行良好,不再崩溃,但仍然存在问题,它没有完全按照您的要求执行。这是现在的样子

function PullSelectedData() {
  var GeneralDataFirstLocation = "D4"; //data starting point cell D4
  var ColumnsBetweenSeries = 4;        //want data from each of the 4 columns (D4, H4, L4, P4)
  var ReturnedValue = 0;

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var BondCheckSS = spreadsheet.getSheetByName("BONDCHECKSHEET");

  for (var i = 0; i < ColumnsBetweenSeries; i++) {
      BondCheckSS.getRange(GeneralDataFirstLocation).offset(0, ColumnsBetweenSeries * i).activate();
      ReturnedValue = BondCheckSS.getActiveCell().getValue();
  }
}

主要问题是 ReturnedValue 在循环的每次迭代中都会被覆盖。因此,我们需要在每次迭代时将其添加到总计中,或者我们可以将它们全部放入一个列表中,之后我们可以使用该列表进行进一步处理。

如果我们希望将每个单元格的值添加到总计中,那么您在循环中设置 ReturnedValue 的行将变为以下内容

ReturnedValue += BondCheckSS.getActiveCell().getValue();

如果我们想把它全部放在一个列表中,我们可以使用追加函数将每个元素添加到一个列表中,MyList.append(valueToAppend),在这种情况下,声明ReturnedValue变成如下:

var ReturnedValue = [];

在循环内部,设置 ReturnedValue 变为以下内容,它将每个值添加到列表的末尾

ReturnedValue.append(BondCheckSS.getActiveCell().getValue());

求和例子
function PullSelectedData() {
  var GeneralDataFirstLocation = "D4"; //data starting point cell D4
  var ColumnsBetweenSeries = 4;        //want data from each of the 4 columns (D4, H4, L4, P4)
  var ReturnedValue = 0;

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var BondCheckSS = spreadsheet.getSheetByName("BONDCHECKSHEET");

  for (var i = 0; i < ColumnsBetweenSeries; i++) {
      BondCheckSS.getRange(GeneralDataFirstLocation).offset(0, ColumnsBetweenSeries * i).activate();
      ReturnedValue += BondCheckSS.getActiveCell().getValue(); // Notice the change from = to +=
  }
}
列表示例
function PullSelectedData() {
  var GeneralDataFirstLocation = "D4"; //data starting point cell D4
  var ColumnsBetweenSeries = 4;        //want data from each of the 4 columns (D4, H4, L4, P4)
  var ReturnedValue = []; // Notice change from 0 to []

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var BondCheckSS = spreadsheet.getSheetByName("BONDCHECKSHEET");

  for (var i = 0; i < ColumnsBetweenSeries; i++) {
      BondCheckSS.getRange(GeneralDataFirstLocation).offset(0, ColumnsBetweenSeries * i).activate();
      ReturnedValue.append( BondCheckSS.getActiveCell().getValue() ); // We now append each value to the list instead of overwriting it each time
  }
} // ReturnedValue is now filled with the values of D4, H4, L4 and P4, Ex: [10, 20, 30, 40]