使用谷歌Apps脚本,有没有写在谷歌电子表格阵列的范围值,而不循环的方法吗?
我想到像下面这样把每个人的名字进入细胞A1:A3
function demoWriteFromArray() {
var employees=["Adam","Barb","Chris"];
ssActive = SpreadsheetApp.getActiveSheet();
rgMyRange = ssActive.getRange("A1:A3");
rgMyRange.setValue(employees)
}
上面的问题是,执行之后, A1:A3
都含有={"Adam","Barb","Chris"} and display "Adam"
。
Answer 1:
Range.setValue()用于设置在范围的每一个细胞相同的值,而setValues方法用于设置值的数组到该范围内的相应的单元。 注意,此方法需要一个多维阵列中,与外阵列被行和内阵列是列。 所以你的情况的数据应该是这样的:
var employees=[["Adam"],["Barb"],["Chris"]];
Answer 2:
尽管这是一个有点晚了,说不定有人会在某些时候碰到过这样的答案。 我写胁迫1-d阵列成2 d阵列(矩阵),这是所预期作为参数的函数Range.setValues()
// Morphs a 1-d array into a 2-d array for use with Range.setValues([][])
function morphIntoMatrix(array) {
// Create a new array and set the first row of that array to be the original array
// This is a sloppy workaround to "morphing" a 1-d array into a 2-d array
var matrix = new Array();
matrix[0] = array;
// "Sanitize" the array by erasing null/"null" values with an empty string ""
for (var i = 0; i < matrix.length; i ++) {
for (var j = 0; j < matrix[i].length; j ++) {
if (matrix[i][j] == null || matrix[i][j] == "null") {
matrix[i][j] = "";
}
}
}
return matrix;
}
我不能保证,除了基本数据类型的任何值将被保留。 该消毒是必要的,因为JavaScript内部似乎在原有的阵列,以取代空值null
或"null"
时,它被指定为另一个数组的元素。 至少,这是我的经验。 它的工作原理虽然,有人可能会觉得它有用。
Answer 3:
我用约10倍提高脚本的执行时间。 它的工作对我来说是这样的:
function xabo_api() {
var sskey = 'KEY-CODE';
var doc = SpreadsheetApp.openById(sskey);
var conn = Jdbc.getConnection("jdbc:mysql://HOST:PORT/DB", "USER", "PWD");
var stmt = conn.createStatement();
//stmt.setMaxRows(5000);
var rs = stmt.executeQuery("select * from xabo;");
var sheet = doc.setActiveSheet(doc.getSheetByName("xabo laboratories"));
//var cell = doc.getRange('A2');
var row = 0;
var data = [];
while (rs.next()) {
var rowData = [];
for (var col = 0; col < rs.getMetaData().getColumnCount(); col++) {
rowData[col] = (rs.getString(col + 1));
}
data[row] = rowData;
row++;
}
// My script writes from the second row, as first I use for headers only
var range = sheet.getRange(2,1,row, col); // check edges or uses a1 notation
range.setValues(data);
// This is what google api doc suggests: It takes 10x more row by row
// while (rs.next())
// {
// for (var col = 0; col < rs.getMetaData().getColumnCount(); col++){
// cell.offset(row, col).setValue(rs.getString(col + 1));
// }
// row++;
// }
rs.close();
stmt.close();
conn.close();
}
Answer 4:
顶端回答提供书写一个数组的一个行,但写一列是有点困难的一个不错的,简洁的方式,但因为这是这里的问题,这里有一个快速的函数来做到这一点:
function addArrayToSheetColumn(sheet, column, values) {
const range = [column, "1:", column, values.length].join("");
const fn = function(v) {
return [ v ];
};
sheet.getRange(range).setValues(values.map(fn));
}
在哪里,那么你会调用该函数在你的代码如下所示:
const ss = SpreadsheetApp.getActiveSpreadsheet();
const cache = ss.getSheetByName("_cache_");
const results = ["Adam","Barb","Chris"];
addArrayToSheetColumn(cache, "A", results);
Answer 5:
研究为我自己的应用程序的答案,当我看到这个问题。 另一种解决方案是使用一个自定义函数返回一个2D阵列。
下面是一个例子。 假设“亚当,倒钩,克里斯·亚伦,比尔,辛迪”在A1文本。 如果你把一个引用到自定义功能B1,可以补范围B1:有个人的名字D2。
写在Google Apps脚本自定义函数:
function splitNames(names) {
// you could do any other work necessary here
var arr = names.split("; ");
arr[0] = arr[0].split(", ");
arr[1] = arr[1].split(", ");
// output should be 2D array where each element of the
// main array is a range spanning 1 or more columns and
// one row and each sub array are cells within that range
return arr;
}
引用自定义函数在B1的公式: =splitNames(A1)
注意,这个函数将抛出一个异常,如果相邻的B1单元格不为空。 这可能与处理IFERROR
公式或可能尝试自定义公式中/ catch语句。
Answer 6:
这里有四个功能:(1)设定值(2)设置(3)的设置(4)复制值的区域,并且将其粘贴值的区域的垂直范围的值的水平范围内。
function SetHorizontalRange() {
var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var Sheet = Spreadsheet.getActiveSheet();
var row = 1; var numRows = 1;
var column = 1; var numColumns = 3; //("A1:C1")
var Range = Sheet.getRange(row, column, numRows, numColumns)
var values = [[["Adam"],["Barb"],["Chris"]]];
Range.setValues(values)
}
//////////////////////////////////////////////////////////////////////////////ℱℳ
function SetVerticalRange() {
var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var Sheet = Spreadsheet.getActiveSheet();
var row = 1; var numRows = 3;
var column = 1; var numColumns = 1; //("A1:A3")
var Range = Sheet.getRange(row, column, numRows, numColumns)
var values = [["Adam"],["Barb"],["Chris"]];
Range.setValues(values)
}
//////////////////////////////////////////////////////////////////////////////ℱℳ
function SetArea(){
var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var Sheet = Spreadsheet.getActiveSheet();
var row = 1; var numRows = 3;
var column = 1; var numColumns = 3; //("A1:C3")
var Range = Sheet.getRange(row, column, numRows, numColumns)
var values = [[[["Adam"]], [["Barb"]], [["Chris"]]], [[["Barb"]], [["Chris"]], [["Adam"]]], [[["Chris"]], [["Adam"]], [["Barb"]]]];
Range.setValues(values)
}
//////////////////////////////////////////////////////////////////////////////ℱℳ
function CopyPasteArea(){
var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var Sheet = Spreadsheet.getActiveSheet();
var row = 1; var column = 1;
var Range = Sheet.getRange(row, column);
var values = new Array(3);
for (var y = 0; y < 3; y++) {
values[y] = new Array(3);
for (var x = 0; x < 3; x++) {
values[y][x] = Range.offset(x,y).getValues(); Logger.log(x+' '+y);
}
}
Sheet.getRange(4, 1, 3, 3).setValues(values); Logger.log(values)
//https://developers.google.com/apps-script/best_practices
}
文章来源: Google Apps Script Spreadsheets - Write Array to cells