Google脚本中的数组

时间:2018-04-25 12:08:03

标签: arrays google-apps-script

我在谷歌脚本中苦苦挣扎。 假设我有范围:“A1:B4”。
|列A |列B |
| name1 | value1 |
| name1 | value2 |
| name2 | value3 |
| name2 | value4 |

q

所以,我必须做一个看起来像这样的数组:

 var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Arkusz1");
 var range = ss.getRange("A1:B4").getValues();
 var array = [[]];

我做了这个

 array[0] = name1
 array[0][0] = value1
 array[0][1] = value2
 array[1] = name2
 array[1][0] = value3
 array[1][1] = value4

我正处于第二个维度,我从第一个维度获得第一个字符,我无法更改其后的值,例如而不是 value1

 for(var i = 0; i < range.length; i++)
 {
    array[i] = range [i][0];
    for(var j = 0; j < range[i].length; j++)
    {
      array[i][j] = range[i][j];  
    }   
 }

我只有 n (来自name1的第一个字母)

我会很感激。

@EDIT
enter image description here

好的,谢谢大家的答案但不是它(或者我太愚蠢了解)。我有这个表,我需要做的是创建一个数组,其中 car1 array[0][0] car2 array[0]等,B中的每个值是唯一的日期(array[1] - &gt; car1 的一个日期,array[0][0]不同的日期,但仍然是 car1 然后,在第三个维度汇总列C中的所有值,但取决于相同的日期。我希望它足够清楚。

3 个答案:

答案 0 :(得分:1)

以下是如何做到的,

function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var range = ss.getDataRange().getValues();
 var array = [[]];

   for(var i = 0; i < range.length; i++)
   {
     array[i] = range [i];
   }
  Logger.log(array[0][0]); //prints A1
  Logger.log(array[0][1]); //prints B1
}

这是我使用的电子表格示例。

enter image description here

答案 1 :(得分:1)

您的问题是“2D”Javascript数组(即Google Apps脚本中的数组)在第一维中没有值。第一个维度只是您正在处理的数据行,采用值数组的形式。所有数据都在这个内部数组中:

var arr = sheet.getDataRange().getValues();
for (var r = 0, numRows = arr.length; r < numRows; ++r) {
  // This will log an Array, e.g. [Car1, timestamp, 1324], in a single line.
  Logger.log(arr[r]);
  // This loop over the inner array will log Car1, then timestamp, then 1323, each on its own line.
  for (var c = 0, numCols = arr[0].length; c < numCols; ++c)
    Logger.log(arr[r][c]);
}

使用Object而非Array似乎最容易解决您的(相当不清楚)预期用途。 Object可以具有用户定义的属性,这些属性本身可以包含属性。例如,也许您想要组装一个Object来映射您拥有的所有不同的汽车,然后对于每辆汽车,您想知道它们被驱动的日期,以及每个日期驱动的行驶里程数。构建这样的Object看起来像这样:

// Create an empty Javascript Object and read data from the sheet.
var carHistory = {}, data = sheet.getDataRange().getValues();
// Remove the header row from the data array.
var headers = data.splice(0, 1)[0];

// Determine the appropriate columns needed.
var carIndex = headers.indexOf("carId");
var dayIndex = headers.indexOf("Date Driven");
var milesIndex = headers.indexOf("Miles");

// Build the object by parsing all rows of data.
for (var r = 0; r < data.length; ++r) {
  var row = data[r], id = row[carIndex];

  // If this car has not been seen, add it, and initialize its properties.
  if (!carHistory[id]) carHistory[id] = {"total miles": 0, days: {}};

  // If this day has not been seen, add it.
  var drivenOn = row[dayIndex];
  /* Assumption: stored a string of the date that does not
     parse into a Date object (like a timestamp would) */
  if (!carHistory[id].days[drivenOn]) carHistory[id].days[drivenOn] = 0;

  // Increment the total and the daily miles.
  var miles = row[milesIndex];
  carHistory[id]["total miles"] += miles;
  carHistory[id].days[drivenOn] += miles;
}

// Log the report:
for (var car in carHistory) {
  Logger.log("%s drove %s total miles", car, carHistory[car]["total miles"]);
  for (var day in carHistory[car].days)
    Logger.log("%s drove %s on day %s", car, carHistory[car].days[day], day);
}

您应该在首选的Javascript Developer Reference中阅读有关对象的更多信息。 One such reference is MDN

答案 2 :(得分:0)

挑战在于将数组与潜在的相同值组合在一起。您可以使用递归检查来比较组合之前的数组。

function checkVal(a, b) {
  // Looping through will return a blank array on the last line. Break early.
  if(b !== undefined) {

    // Check the first value in each array. If they're the same, combine and return.
    if(a[0] == b[0]) {
      a.push(b[1])
      return a
    }
  }
}

function coerce() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet7")

  // This returns a 2D array
  var range = sheet.getDataRange().getValues();

  // Initialize a new array
  var array = [];

  for(var i=0; i<range.length; i++) {

   // Compare two rows
   var combined = checkVal(range[i], range[i+1])

   // If you get a new array, push it to [array]
   if(combined) { 
     array.push(combined) 
   }
  }
  Logger.log(array)  // Logs [[Name 1, Value 1, Value 2], [Name 2, Value 1, Value 2]]
}