Google Apps Script Таблицы - запись массива в ячейки
Используя Google Apps Script, существует ли способ записать значения в массиве 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"
.
Ответы
Ответ 1
Range.setValue() используется для установки одинакового значения в каждой ячейке диапазона, а setValues используется для установки массива значений в соответствующие ячейки в диапазоне. Имейте в виду, что этот метод ожидает многомерный массив, а внешний массив - это строки, а внутренний массив - столбцы. Поэтому в вашем случае данные должны выглядеть так:
var employees=[["Adam"],["Barb"],["Chris"]];
Ответ 2
Я улучшил время работы script в 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-й массив к 2-му массиву (матрице), что и ожидается как параметр 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"
, когда ему назначается элемент другого массива. По крайней мере, это мой опыт. Он работает, хотя, кому-то это может показаться полезным.
Ответ 4
Я видел этот вопрос при исследовании ответа для моего собственного приложения. Альтернативным решением является использование пользовательской функции, которая возвращает 2D-массив.
Вот пример. Предположим, что "Адам, Барб, Крис, Аарон, Билл, Синди" - это текст в А1. Если вы поместите ссылку на пользовательскую функцию в B1, вы можете заполнить диапазон B1: D2 индивидуальными именами.
Пользовательская функция, записанная в приложениях Script:
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
или, возможно, try/catch в пользовательской формуле.
Ответ 5
Вот четыре функции: (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
}