Google Apps脚本电子表格 - 将数组写入单元格

Pla*_*GAS 18 arrays google-apps-script

使用Google Apps脚本,有没有办法将Google Spreadsheet数组中的值写入范围而不进行循环?

我正在考虑以下内容,将每个名称放入单元格中 A1:A3

function demoWriteFromArray() {

   var employees=["Adam","Barb","Chris"];

   ssActive = SpreadsheetApp.getActiveSheet();

   rgMyRange = ssActive.getRange("A1:A3");

   rgMyRange.setValue(employees)
} 
Run Code Online (Sandbox Code Playgroud)

上面的问题是执行后,A1:A3都包含={"Adam","Barb","Chris"} and display "Adam".

Eri*_*eda 26

Range.setValue()用于在范围的每个单元格中设置相同的值,而setValues用于将值数组设置为范围内的相应单元格.请注意,此方法需要一个多维数组,外部数组是行,内部数组是列.因此,在您的情况下,数据应如下所示:

var employees=[["Adam"],["Barb"],["Chris"]];
Run Code Online (Sandbox Code Playgroud)


ken*_*ken 12

最佳答案提供了一种将数组写入 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));
}
Run Code Online (Sandbox Code Playgroud)

然后在代码中调用该函数,如下所示:

const ss = SpreadsheetApp.getActiveSpreadsheet();
const cache = ss.getSheetByName("_cache_");
const results = ["Adam","Barb","Chris"];
addArrayToSheetColumn(cache, "A", results);
Run Code Online (Sandbox Code Playgroud)


Chr*_*ice 8

即使有点晚,有人可能会在某个时候遇到这个答案.我编写了一个函数,将一维数组强制转换为二维数组(矩阵),这是一个参数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;
}
Run Code Online (Sandbox Code Playgroud)

我不能保证将保留除基本数据类型之外的任何值.的消毒是必要的,因为在内部的JavaScript似乎在原来的阵列,以取代空值null"null"当它被指定为另一阵列的元件.至少,那是我的经历.虽然它有效但有人可能会发现它很有用.


小智 5

我将脚本执行时间缩短了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();
 }
Run Code Online (Sandbox Code Playgroud)

  • 这似乎无法回答OP的问题。 (2认同)

小智 5

要包装数组元素以便将它们写入列,您还可以使用 array.forEach()

这:

var employees=["Adam","Barb","Chris"];

employees.forEach((item,index,array) => array[index] = [item]);
Run Code Online (Sandbox Code Playgroud)

将对您的数组进行以下更改:

["Adam","Barb","Chris"]  -->  [["Adam"],["Barb"],["Chris"]]
Run Code Online (Sandbox Code Playgroud)

有关forEach的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach