web-dev-qa-db-ja.com

Google Scriptを使用して、配列データをスプレッドシートの列に一度に追加するにはどうすればよいですか?

AddArray []のデータを列Aの最後に一度に追加しようとしています。ただし、私の配列はこの方法を使用できるように多次元ではありません。

これは私が配列に追加する方法です:

  var toAdd=[];
  var thisurl="red Apple http://awebsite.com/1.jpg";
  toAdd.Push(thisUrl);

そして、これは私が一度に配列を追加したい方法です

function AddToSpreadsheet()
{
 var data = SpreadsheetApp.getActiveSheet().getRange('A12:A').getValues();
    var toAdd=["red Apple http://awebsite.com/1.jpg",
              "green Apple http://1awebsite.com/2.jpg",
              "red Apple http://1awebsite.com/3.jpg",
              "rotten Apple http://rottenApple.com"];



  if(toAdd.length > 0){
    for(i = 0; i < data.length; ++i){
      if(data[i][0] == ""){break;}
    }
    SpreadsheetApp.getActiveSheet().getRange(12+i, 1, toAdd.length, 1).setValues(toAdd);
  } 

}

上記のコードを使用すると、次のエラーが発生します。

Cannot convert Array to Object[][]. (line 

私のaddArrayは多次元配列ではありません!上記のコードを使用できるように、次の例のように多次元配列に変換するにはどうすればよいですか?

多次元配列の例:

var toAdd=[["red Apple http://awebsite.com/1.jpg"],
               ["green Apple http://1awebsite.com/2.jpg"],
               ["red Apple http://1awebsite.com/3.jpg"],
               ["rotten Apple http://rottenApple.com"]];

編集:開始時に配列を変換して動作しました!

var values_array=["red Apple http://awebsite.com/1.jpg",
               "green Apple http://1awebsite.com/2.jpg",
               "red Apple http://1awebsite.com/3.jpg",
               "rotten Apple http://rottenApple.com"];

  var toAddArray = [];
for (i = 0; i < toAdd.length; ++i){
    toAddArray.Push([toAdd[i]]);
}
........... 

このようにして、まったく新しい配列を列Aに挿入しました。

............
     SpreadsheetApp.getActiveSheet().getRange(12+i, 1, toAddArray.length, 1).setValues(toAddArray);
}
4
user1788736

配列を「転置」する必要があります。これを行うには、新しい配列を作成し、値を1つの値を持つ配列として追加します。

setValues(toAdd)を呼び出す前に試してください

var toAddArray = [];
for (i = 0; i < toAdd.length; ++i){
    toAddArray.Push([toAdd[i]]);
}

そして、設定値の呼び出しを次のように置き換えます

 SpreadsheetApp.getActiveSheet().getRange(12+i, 1, toAdd.length, 1).setValues(toAddArray);

値の設定関数には、入力として行列が必要です。ネイティブ行列がないため、各サブ配列が同じ長さで配列を含まない配列の配列が必要です。
「マトリックス」内の各配列は行であり、各配列の各要素は列に入ります。
1次元配列から1列の行が必要な場合は、1要素配列の配列が必要です。列を記述したい場合は、すべての値の1つの配列を含む配列を作成します。

8

シートから受け取るアイテムは不変であるため、それらに追加することはできませんが、値を新しい配列にコピーして、古い配列を上書きすることはできます。しかし、私はこの問題に対して別のアプローチを取り、次のように列の最後に印刷しました。

function appendToSheet() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('test'); // Get sheet so I don't have to retype it every time

  var toAppend = [['Append 1'],['Append 2']];                    // Note that this is an array of arrays.
  var newRow = sheet.getLastRow() + 1;                           // This fetches the number of the last row of the entire sheet and adds one to it.
  var endRange = lastRow + toAppend.length - 1;                  // Calculate the last row to append to

  sheet.getRange('A' + newRow + ':A' + endRange).setValues(toAppend); // Write to sheet.
}

ただし、シート配列と追加されたデータを他の場所のコードで使用する場合は、シート全体をフェッチして操作するのではなく、必要な範囲を動的に計算してフェッチするだけです。

function appendToValues() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('test');

  var lastRow = sheet.getLastRow();
  var valuesFromSheet =  sheet.getRange('A1:A' + lastRow).getValues(); // Get values from the sheet

  var toAppend = [['value 1'],['value 2']];

  var newArray = valuesFromSheet.concat(toAppend);                     // .concat() copies the old immutable array and makes a new one with the append array included. 
}
3
Gemtastic