javascript - una - obtener valor celda datatable jquery
Cómo obtener valores de fila y columna de A1Notation (1)
Escribir guiones para Google Spreadsheets puede ser difícil a veces, porque los métodos de Google Spreadsheet que toman números de fila y columna usan indexación basada en 1, mientras que los arreglos de Javascript usan 0.
En este ejemplo, la celda A2
tiene una row == 2
y una column == 1
. Los métodos de SpreadsheetApp invierten la columna y la fila de aquellos en A1Notation, por lo que estos dos rangos son equivalentes:
var range1 = sheet.getRange("A2");
var range2 = sheet.getRange(2, 1);
Una vez que leo el contenido de una hoja en una matriz, las cosas vuelven a ser diferentes.
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var data = sheet.getDataRange().getValues();
Después de eso, el valor que estaba en la celda A2
en mi hoja de cálculo está en los data[1][0]
. La fila y la columna están en el mismo orden que la API de SpreadsheetApp, pero cada una es 1 menos.
Las respuestas a muchas preguntas aquí ( ejemplo ) se han reducido al desajuste de estas diferentes formas de indexación. El código que está lleno de instrucciones row+1
y col-1
puede ser difícil de depurar.
Finalmente: si conozco la referencia de una celda en A1Notation, diga AZ342
, ¿cómo puedo averiguar los valores de índice correctos que corresponden a esa celda en la matriz 2D, data
, obtenidos del rango de datos completo?
Obviamente, puedes tener mucho cuidado con el seguimiento de los lugares en los que estás usando cualquier tipo de indexación, y estarás bien.
Pero sería más fácil hacer algo como esto:
var importantCell = "AZ342";
var cellIndexConverted = cellA1ToIndex( importantCell );
var data[cellIndexConverted.row][cellIndexConverted.col] = "Some new value";
ConvertA1.gs
Aquí hay tres funciones de ayuda para simplificar la conversión de A1Notation.
Estas funciones de ayuda también están disponibles como una esencia .
/**
* Convert a cell reference from A1Notation to 0-based indices (for arrays)
* or 1-based indices (for Spreadsheet Service methods).
*
* @param {String} cellA1 Cell reference to be converted.
* @param {Number} index (optional, default 0) Indicate 0 or 1 indexing
*
* @return {object} {row,col}, both 0-based array indices.
*
* @throws Error if invalid parameter
*/
function cellA1ToIndex( cellA1, index ) {
// Ensure index is (default) 0 or 1, no other values accepted.
index = index || 0;
index = (index == 0) ? 0 : 1;
// Use regex match to find column & row references.
// Must start with letters, end with numbers.
// This regex still allows induhviduals to provide illegal strings like "AB.#%123"
var match = cellA1.match(/(^[A-Z]+)|([0-9]+$)/gm);
if (match.length != 2) throw new Error( "Invalid cell reference" );
var colA1 = match[0];
var rowA1 = match[1];
return { row: rowA1ToIndex( rowA1, index ),
col: colA1ToIndex( colA1, index ) };
}
/**
* Return a 0-based array index corresponding to a spreadsheet column
* label, as in A1 notation.
*
* @param {String} colA1 Column label to be converted.
*
* @return {Number} 0-based array index.
* @param {Number} index (optional, default 0) Indicate 0 or 1 indexing
*
* @throws Error if invalid parameter
*/
function colA1ToIndex( colA1, index ) {
if (typeof colA1 !== ''string'' || colA1.length > 2)
throw new Error( "Expected column label." );
// Ensure index is (default) 0 or 1, no other values accepted.
index = index || 0;
index = (index == 0) ? 0 : 1;
var A = "A".charCodeAt(0);
var number = colA1.charCodeAt(colA1.length-1) - A;
if (colA1.length == 2) {
number += 26 * (colA1.charCodeAt(0) - A + 1);
}
return number + index;
}
/**
* Return a 0-based array index corresponding to a spreadsheet row
* number, as in A1 notation. Almost pointless, really, but maintains
* symmetry with colA1ToIndex().
*
* @param {Number} rowA1 Row number to be converted.
* @param {Number} index (optional, default 0) Indicate 0 or 1 indexing
*
* @return {Number} 0-based array index.
*/
function rowA1ToIndex( rowA1, index ) {
// Ensure index is (default) 0 or 1, no other values accepted.
index = index || 0;
index = (index == 0) ? 0 : 1;
return rowA1 - 1 + index;
}