【问题标题】:Google Apps Script: how to copy array of objects to range?Google Apps 脚本:如何将对象数组复制到范围?
【发布时间】:2016-12-09 04:04:54
【问题描述】:

我有一个名为 membership 的对象数组:

[{name: 'Linus Pauling', address: '1805 Main Street', phone: '(615) 555-1010', 
  email: 'linus.pauling@gmail.com' },

 {name: 'Maury Povich', address: '382 North Street', phone: '(423) 555-1997', 
  email: 'maury@themauryshow.org'}]

(虽然这里只显示了 4 个,但我确实每个成员有十个键/值对。)

将此数组的位复制到 Google 表格中的一系列单元格的最佳方法是什么?我正在尝试找到一种方法来直接调用对象值,并使用 .SetValues 方法来批量复制它们,而不是一次复制一个。

要获取 A 列中所有成员的姓名,我尝试过:

sheet.getRange(1,1,membership.length,1).setValues(membership[{member.name}]);

...给Missing : after property ID.

或者:

sheet.getRange(1,1,membership.length,1).setValues([membership[name]]);

...给出 ReferenceError: "name" is not defined.

或者:

sheet.getRange(1,1,membership.length,1).setValues([member.name]);

...给出“无法将数组转换为对象[][]”错误。

对于新手的问题,我深表歉意。我已经看到 answers 关于如何将值从多维数组复制到工作表的范围,而不是对象数组。

【问题讨论】:

标签: javascript arrays object google-apps-script google-sheets


【解决方案1】:

您是否希望以以下形式生成表格:

name | Address | phone | email
-----+---------+-------+------
.... | ....    | ....  | ....

等等?

如果是这样,那么下面的 sn-p 可能会有所帮助。这里要指出的关键是,您在遍历对象时不能期望给定的顺序。即,仅仅因为您对membership 的表示首先列出name,并不意味着如果您要使用for ... in 循环,您可以保证 name 会首先返回 - 对象在 JavaScript 中是无序的

为确保给定顺序,sn-p I 列表定义了一个数组headings,您可以在其中指定所需列在工作表中的顺序。这用于保证输出中的列顺序:

var membership = [
  {
    name: 'Linus Pauling', address: '1805 Main Street', phone: '(615) 555-1010', 
    email: 'linus.pauling@gmail.com'
  },
  {
    name: 'Maury Povich', address: '382 North Street', phone: '(423) 555-1997', 
    email: 'maury@themauryshow.org'
  }
];

// Headings in the column order that you wish the table to appear.
var headings = ['name', 'address', 'phone', 'email'];
var outputRows = [];

// Loop through each member
membership.forEach(function(member) {
  // Add a new row to the output mapping each header to the corresponding member value.
  outputRows.push(headings.map(function(heading) {
    return member[heading] || '';
  }));
});

// Write to sheets
if (outputRows.length) {
  // Add the headings - delete this next line if headings not required
  outputRows.unshift(headings);
  SpreadsheetApp.getActiveSheet().getRange(1, 1, outputRows.length, outputRows[0].length).setValues(outputRows);
}

输出是:

【讨论】:

  • 谢谢。我完全不知道 map 方法,这正是这里需要的。
【解决方案2】:

下面的脚本怎么样?该脚本是电子表格的容器绑定脚本。有2种模式。模式 1 和模式 2 的数据排列方式不同。

模式 1 是

模式 2 是

function main() {
  var data = [{name: 'Linus Pauling', address: '1805 Main Street', phone: '(615) 555-1010', 
  email: 'linus.pauling@gmail.com' }, {name: 'Maury Povich', address: '382 North Street', phone: '(423) 555-1997', 
    email: 'maury@themauryshow.org'}];
  var sheet = SpreadsheetApp.getActiveSheet();

  var result = pattern1(data);
  var result = pattern2(data);

  sheet.getRange('a1').offset(0, 0, result.length, result[0].length).setValues(result);
}

function pattern1(data){
  var ar = [];
  for (var i in data){
    for (var key in data[i]){
      ar.push([key, data[i][key]]);
    }
  }
  return ar;
}

function pattern2(data){
  var ar = [];
  var keys = [];
  var values = [];
  for (var i in data){
    for (var key in data[i]){
      if (i == 0) keys.push(key);
      values.push(data[i][key]);
    }
    if (i == 0){
      ar.push(keys);
      keys = [];
    }
    ar.push(values);
    values = [];
  }
  return ar;
}

如果我对您的问题的理解有误,我深表歉意。

【讨论】:

    【解决方案3】:

    请参阅Simple Mail Merge Tutorial 底部的脚本以获取一些有用的代码来检索数据。将此注释中的所有代码复制下来:

    //////////////////////////////////////////////////////////////////////////////////////////
    //
    // The code below is reused from the 'Reading Spreadsheet data using JavaScript Objects'
    // tutorial.
    //
    /////////
    
    /////////////////////////////////////////////////////////////////////////////////
    
    // getRowsData iterates row by row in the input range and returns an array of objects.
    

    一旦获得,getRowsData 不仅会返回数据,还会返回第二项,即标题列表。使用它,您可以修改来自@Bardy 的代码以允许以任何顺序的标题,以及中间的其他可能的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多