Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取Row&;A10符号中的列值_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 如何获取Row&;A10符号中的列值

Javascript 如何获取Row&;A10符号中的列值,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,为Google电子表格编写脚本有时会很困难,因为采用行和列编号的Google电子表格方法使用基于1的索引,而Javascript数组使用基于0的索引 在本例中,单元格A2具有行==2和列==1。SpreadsheetApp方法与A1表示法中的列和行相反,因此这两个范围是等效的: var range1 = sheet.getRange("A2"); var range2 = sheet.getRange(2, 1); 一旦我将一张工作表的内容读入一个数组,情况就又不同了 var ss=Spre

为Google电子表格编写脚本有时会很困难,因为采用行和列编号的Google电子表格方法使用基于1的索引,而Javascript数组使用基于0的索引

在本例中,单元格
A2
具有
行==2
列==1
。SpreadsheetApp方法与A1表示法中的列和行相反,因此这两个范围是等效的:

var range1 = sheet.getRange("A2");
var range2 = sheet.getRange(2, 1);
一旦我将一张工作表的内容读入一个数组,情况就又不同了

var ss=SpreadsheetApp.getActive();
var sheet=ss.getActiveSheet();
var data=sheet.getDataRange().getValues();
之后,我的电子表格中单元格
A2
中的值位于
数据[1][0]
中。行和列的顺序与SpreadsheetApp API相同,但每行和列的顺序都比SpreadsheetApp API小1

这里很多问题的答案()归结为这些不同形式的索引不匹配。充满行+1列-1语句的代码可能很难调试


最后:如果我知道A1表示法中某个单元格的引用,比如说
AZ342
,我如何找到与2D数组中该单元格相对应的正确索引值,
data
,从完整数据范围获得?

显然,您可以非常小心地跟踪正在使用任何一种索引的位置,这样您就不会有问题了

但这样做更容易:

var importantCell = "AZ342";
var cellIndexConverted = cellA1ToIndex( importantCell );
var data[cellIndexConverted.row][cellIndexConverted.col] = "Some new value";
转换A1.gs 下面是三个帮助函数,用于简化从注释的转换

这些辅助函数也可以使用

/**
*将单元格引用从A1表示法转换为基于0的索引(对于数组)
*或基于1的索引(用于电子表格服务方法)。
*
*@param{String}cellA1要转换的单元格引用。
*@param{Number}索引(可选,默认为0)表示0或1索引
*
*@return{object}{row,col},都是基于0的数组索引。
*
*@如果参数无效,则抛出错误
*/
函数cellA1ToIndex(cellA1,索引){
//确保索引为(默认)0或1,不接受其他值。
指数=指数| | 0;
指数=(指数==0)?0:1;
//使用正则表达式匹配查找列和行引用。
//必须以字母开头,以数字结尾。
//这个正则表达式仍然允许工业个人提供非法字符串,如“AB.#%123”
var match=cellA1.match(/(^[A-Z]+)|([0-9]+$)/gm);
如果(match.length!=2)抛出新错误(“无效单元格引用”);
var colA1=匹配[0];
var rowA1=匹配[1];
返回{row:rowA1ToIndex(rowA1,索引),
col:colA1ToIndex(colA1,index)};
}
/**
*返回对应于电子表格列的基于0的数组索引
*标签,如A1符号。
*
*@param{String}colA1要转换的列标签。
*
*@return{Number}0基于数组索引。
*@param{Number}索引(可选,默认为0)表示0或1索引
*
*@如果参数无效,则抛出错误
*/
函数colA1ToIndex(colA1,索引){
if(colA1的类型!='string'| | colA1.length>2)
抛出新错误(“预期的列标签”);
//确保索引为(默认)0或1,不接受其他值。
指数=指数| | 0;
指数=(指数==0)?0:1;
var A=“A”.charCodeAt(0);
变量编号=colA1.charCodeAt(colA1.length-1)-A;
如果(colA1.length==2){
数字+=26*(colA1.charCodeAt(0)-A+1);
}
返回编号+索引;
}
/**
*返回对应于电子表格行的基于0的数组索引
*数字,如A1表示法。几乎毫无意义,真的,但是
*与colA1ToIndex()对称。
*
*@param{Number}rowA1要转换的行号。
*@param{Number}索引(可选,默认为0)表示0或1索引
*
*@return{Number}0基于数组索引。
*/
函数rowA1ToIndex(rowA1,索引){
//确保索引为(默认)0或1,不接受其他值。
指数=指数| | 0;
指数=(指数==0)?0:1;
返回行1-1+索引;
}

我想发布另一个解决方案,因为我通常考虑使用循环转换字符串,而不是检查其长度

function convertSheetNotation(a1_notation) {
    const match = a1_notation.match(/(^[A-Z]+)|([0-9]+$)/gm);

    if (match.length !== 2) {
        throw new Error('The given value was invalid. Cannot convert Google Sheet A1 notation to indexes');
    }

    const column_notation = match[0];
    const row_notation = match[1];

    const column = convertColumnNotationToIndex(column_notation);
    const row = convertRowNotationToIndex(row_notation);

    return [row, column];
}

function convertColumnNotationToIndex(a1_column_notation) {
    const A = 'A'.charCodeAt(0);

    let output = 0;
    for (let i = 0; i < a1_column_notation.length; i++) {
        const next_char = a1_column_notation.charAt(i);
        const column_shift = 26 * i;

        output += column_shift + (next_char.charCodeAt(0) - A);
    }

    return output;
}

function convertRowNotationToIndex(a1_row_notation) {
    const num = parseInt(a1_row_notation, 10);
    if (Number.isNaN(num)) {
        throw new Error('The given value was not a valid number. Cannot convert Google Sheet row notation to index');
    }

    return num - 1;
}
函数表示法(a1_表示法){
常量匹配=a1_符号匹配(/(^[A-Z]+)|([0-9]+$)/gm);
if(match.length!==2){
抛出新错误('给定值无效。无法将Google工作表A1表示法转换为索引');
}
常量列_表示法=匹配[0];
常量行_表示法=匹配[1];
const column=convertColumnNotationToIndex(列表示法);
const row=convertRowNotationToIndex(行表示法);
返回[行,列];
}
函数转换ColumnNotationToIndex(a1_column_表示法){
常数A='A'.charCodeAt(0);
设输出=0;
for(设i=0;i

感谢@Mogsdad,因为这是对您答案的一个小修改,尽管我相信我的解决方案效率较低。

感谢您的分享,我们保存了此内容,稍后将对其进行处理:)@Munkey-默认索引处理中存在错误,现在修复了。你知道有什么好的链接教你如何破解调试器吗?@Munkey-这里有一个,一个好的开始。和往常一样,如果有任何特定的调试问题,请立即询问!