使用Google Apps脚本,有没有办法将Google Spreadsheet数组中的值写入范围而不循环?
我正在考虑以下内容,将每个名称分别放入单元格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"
。
答案 0 :(得分:23)
Range.setValue()用于在范围的每个单元格中设置相同的值,而setValues用于将值数组设置为范围内的相应单元格。请注意,此方法需要一个多维数组,外部数组是行,内部数组是列。因此,在您的情况下,数据应如下所示:
var employees=[["Adam"],["Barb"],["Chris"]];
答案 1 :(得分:7)
尽管有点晚,有人可能会在某个时候遇到这个答案。我编写了一个函数,将一维数组强制转换为二维数组(矩阵),这是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"
替换原始数组中的空值,当它被指定为另一个数组的元素时。至少,那是我的经历。虽然有用,但有人可能觉得它很有用。
答案 2 :(得分:4)
我将脚本执行时间提高了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();
}
答案 3 :(得分:1)
要包装数组元素以便可以将它们写入列中,还可以使用 array.forEach()
此:
var employees=["Adam","Barb","Chris"];
employees.forEach((item,index,array) => array[index] = [item]);
将对数组进行以下更改:
["Adam","Barb","Chris"] --> [["Adam"],["Barb"],["Chris"]]
有关 forEach 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
答案 4 :(得分:0)
在研究我自己的应用程序的答案时,我看到了这个问题。另一种解决方案是使用返回2D数组的custom function。
这是一个例子。假设&#34; Adam,Barb,Chris; Aaron,Bill,Cindy&#34;是A1中的文字。如果在B1中引用自定义函数,则可以使用单个名称填充B1:D2范围。
在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。
答案 5 :(得分:0)
最佳答案提供了一种将数组写到ROW的好方法,但是要写到COLUMN有点困难,但这是问题所在,因此这里有一个快速的函数:
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);
答案 6 :(得分:0)
您可以使用push
var employees=["Adam","Barb","Chris"];
var newarray = [[],[]] ;
newarray[0].push(employees) ;
ssActive = SpreadsheetApp.getActiveSheet();
rgMyRange = ssActive.getRange("A1:A3");
rgMyRange.setValues(newarray)
请注意,您需要将setValue更改为setValues
答案 7 :(得分:-3)
以下是四个功能:(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
}