【发布时间】:2019-10-24 10:54:56
【问题描述】:
在众多Google Apps Script best practices中,对于脚本性能的提升,建议尽量减少对其他服务的调用:
在脚本中使用 JavaScript 操作比调用其他服务要快得多。您可以在 Google Apps 脚本本身内完成的任何操作都比进行需要从 Google 的服务器或外部服务器获取数据的调用(例如对电子表格、文档、站点、翻译、UrlFetch 等的请求)要快得多。如果您能找到将脚本对这些服务的调用降至最低的方法,您的脚本将会运行得更快。
因此,在处理电子表格上的 GAS 时,通常的做法是将工作表中的值作为一个整体复制到二维数组中,对数组进行所有操作,然后将数组中的所有数据刷新回工作表。
一旦您将工作表中的所有数据复制到二维数组中,处理列可能会很棘手,尤其是对于大型列集,因此使用使用 A1 从二维数组中提取/设置数据的函数可能会很方便表示法,因为这允许在工作表上直观地确定正确的范围是什么,同时使用 Javascript 转码函数来相应地识别列和行。
在没有重新发明轮子的情况下,我想知道是否有人编写了一些代码来从二维数组中提取数据作为子数组,使用电子表格范围 A1 表示法来引用子数组的边界。
例如,假设一个自定义函数getRange:
var SS = SpreadsheetApp.openById(myID); // open spreadsheet
var sheet = SS.getSheetByName("Test"); // get sheet
var sheetValues = sheet.getSheetValues(1,1,-1,-1); // copy all values from sheet to 2D array
// samples: how the function could be invoked to extract subarray using A1 notation
var subArray = getRange(sheetValues, "A2:A"); // returns a "column" from the array begin at row 2
subArray = getRange(sheetValues, "A2"); // returns a "cell" from the array (1,0)
subArray = getRange(sheetValues, "B2:D3"); // returns a 2D subarray
类似于this
编辑:
我从another similar post 复制了以下代码,现在我已经正确设置了参数:
var matrix = [
["a1", "b1", "c1", "d1"],
["a2", "b2", "c2", "d2"],
["a3", "b3", "c3", "d3"],
["a4", "b4", "c4", "d4"]
]
var startRow = 1
var startCol = 0
var endRow = 2
var endCol = 0
var section = matrix.slice(startRow, endRow + 1).map(i => i.slice(startCol, endCol + 1))
console.log(JSON.stringify(section))
我会进一步研究A1转码!
【问题讨论】:
标签: javascript arrays google-apps-script multidimensional-array google-sheets