Mover celular "activa" en la Hoja de Google lenguaje de macros

Martin Feinstein:

Estoy tratando de escribir una función que tira de la enésima (en el ejemplo 4º) columna de datos de una hoja a partir de una fila determinada / columna, cuya dirección se define como una variable. He intentado utilizar Offset pero el .getrange () para mover la célula "activa" a la posición enésima y hacen que las células de la celda activa, pero aborta macro. ¿Alguien ha hecho esto? Debido a la naturaleza de los datos, es importante que muevo la célula "activa" n columnas. Subconjunto de código de abajo:

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

  }

}
theman25:

¿Por qué se estrelló

  • La primera cuestión es que Offsetno es una función, por lo que debería ser offset, aunque sus argumentos de la función son correctos, por lo que se resuelve el problema.
  • La siguiente cuestión es que getActiveCellno es una función por sí solo, debe ser llamado en la hoja. Por ejemplo,MySheet.getActiveCell()
  • Un tercer tema que no tenga como consecuencia su código de choque, pero le permite utilizar la ColumnsBetweenSeriesvariable está cambiando su bucle defor (var i = 0; i < ColumnsBetweenSeries; i++) {

comportamiento no deseado

En este punto, el código funciona muy bien ahora, que ya no se bloquea, pero todavía hay un problema, que no acaba de hacer lo que quiera que haga. Aquí es lo que parece ahora

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

El principal problema es que ReturnedValuese sobreescribe cada iteración del bucle. Así tenemos que añadir ya sea a un total de cada iteración, o podemos poner a todos en una lista con la que podemos hacer un segundo procesamiento.

Si deseamos añadir el valor de cada celda para un total, entonces la línea en la que se establece ReturnedValueen el bucle se convierte en la siguiente

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

Si queremos poner todo en una lista, podemos añadir cada uno de los elementos de una lista utilizando la función de agregación, MyList.append(valueToAppend)en cuyo caso, declarando ReturnedValueconvierte en la siguiente:

var ReturnedValue = [];

y dentro del bucle, el establecimiento ReturnedValuese convierte en el siguiente, lo que añade cada valor al final de la lista

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

ejemplo 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 +=
  }
}
ejemplo de lista
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]

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=405902&siteId=1
Recomendado
Clasificación