web-dev-qa-db-ja.com

Google Apps Scriptスプレッドシート-配列をセルに書き込む

Google Apps Scriptを使用して、ループせずにGoogleスプレッドシート配列の値を範囲に書き込む方法はありますか?

私は次のようなものを考えて、それぞれの名前をセルに入れます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"を含むことです。

17

Range.setValue()は、範囲のすべてのセルに同じ値を設定するために使用され、 setValues は、範囲内の対応するセルに値の配列を設定するために使用されます。このメソッドは、外部配列が行で、内部配列が列である多次元配列を想定していることに注意してください。したがって、あなたの場合、データは次のようになります。

var employees=[["Adam"],["Barb"],["Chris"]];
24
Eric Koleda

スクリプトの実行時間を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();
 }
5
user2890988

一番上の答えは、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);
1
ken

私は自分のアプリケーションの答えを調査するときにこの質問を見ました。別の解決策は、2D配列を返す カスタム関数 を使用することです。

以下に例を示します。 「Adam、Barb、Chris; Aaron、Bill、Cindy」が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式で処理するか、カスタム式内でtry/catchすることができます。

0
mjblay