Переместить «активную» ячейку на макроязыке Googles Sheet - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь написать функцию, которая извлекает n-й (в примере 4-й) столбец данных из листа, начиная с определенной строки / столбца, адрес которого определяется как переменная. Я попытался использовать смещение, но .getrange () переместил «активную» ячейку в n-ю позицию и сделал эту ячейку активной, но макрос отменяется. Кто-нибудь делал это? Из-за характера данных важно, чтобы я переместил «активную» ячейку на 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();

  }

}

1 Ответ

1 голос
/ 04 апреля 2020

Почему произошел сбой

  • Первая проблема заключается в том, что Offset не является функцией, поэтому должно быть offset, хотя ваши аргументы для функции верны , так что эта проблема решена.
  • Следующая проблема заключается в том, что getActiveCell не является отдельной функцией, ее нужно вызывать на листе. Например, MySheet.getActiveCell()
  • Третья проблема, которая не приводит к тому, что ваш код обрабатывает sh, но позволяет использовать переменную ColumnsBetweenSeries, меняет ваш l * От 1050 * до 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 перезаписывается при каждой итерации l oop. Таким образом, нам нужно либо добавлять его к итоговой сумме на каждой итерации, либо мы можем поместить их все в список, с помощью которого мы сможем впоследствии выполнять дальнейшую обработку.

Если мы добавим sh значение каждой ячейки к сумме, то строка, в которой вы установите ReturnedValue в l oop, станет следующей

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

Если мы хотим поместить все это в список, мы можем добавить каждый из элементов в список, используя функцию добавления MyList.append(valueToAppend), в этом случае объявление ReturnedValue становится следующим:

var ReturnedValue = [];

и внутри l oop настройка ReturnedValue становится следующей, добавляя каждое значение в конец списка

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

Sum пример
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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...