【问题标题】:Arrays in Google ScriptsGoogle 脚本中的数组
【发布时间】:2018-04-25 12:08:03
【问题描述】:

我在 google 脚本中遇到了数组问题。 假设我有范围:“A1:B4”。
|A栏|B栏|
|名称1 |值1|
|名称1 |值2|
|名称2 |值3|
|name2 |value4|

 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

我做了这个

 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];  
    }   
 }

我正在进入第二个维度,我从第一个维度获得第一个字符,并且我无法更改它之后的值,例如而不是 value1 on:

array[0][0]

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

我会很感激任何想法。

@EDIT

好的,谢谢大家的回答,但事实并非如此(或者我太愚蠢了,无法理解)。我有这张表,我需要做的是制作一个数组,其中 car1array[0]car2array[1] 等,并且 B 中的每个值都是唯一日期( array[0][0] -> car1 的一个日期,array[0][1] 不同的日期,但仍然是 car1 然后,在第三维中汇总了 C 列中的所有值,但取决于在同一天。我希望它足够清楚。

【问题讨论】:

  • 尝试使用 SpreadsheetApp.getDataRange().getValues() 代替 getRange。这将为您提供 [n][n] 数组中的值。
  • 仍然没有,我得到了这样的结果:array[0] = name, array[0][0] = n // 应该是 value1, array[0][1] = a / / 应该是 value2
  • 如果myArr[i] 不是一个数组("some name" 是一个String)但可以索引(如String),那么myArr[i][j] 将访问其值的索引。也许您想用您的数据创建一个对象,例如{prop1: [val1, val2, val3], prop2: {subprop1: val}, ... }。对于 Apps Script 中的 Sheet-writeable 数组,第一维必须始终是数组,所有数据都保存在数组的第二维中。
  • 我认为您的问题在编辑后不一样。也不清楚

标签: arrays google-apps-script


【解决方案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 开发人员参考中阅读有关对象的更多信息。 One such reference is MDN.

【讨论】:

  • 非常感谢,我想我会去那里阅读更多关于js中的对象
【解决方案2】:

你可以这样做,

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
}

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

【讨论】:

    【解决方案3】:

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

    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]]
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多