首页 > 解决方案 > 在对象中获取 google sheet 行和列的二维值

问题描述

嗨,我正在尝试获取第一行和第二行的值,然后将它们添加到对象中,尽管我已将其编码如下

function getTime(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var d = {}
  var quantity = ss.getRange(2,4,2,24).getDisplayValues();
  var fruit = ss.getRange(3,4,3,24).getValues();
  var quantity = quantity[0].filter(item => item);
  var fruit = fruit[0].filter(item => item);

 for (let i = 0; i < quantity.length; i++) {
    for (let j = 0; j < fruit.length; i++){
      d[quantity[i]] = fruit[j]
    }
  }

但我不喜欢这种方法(其次,这个for循环卡住了)所以我想更加自动化,这样可以减少数据中的错误

我需要的是这样的对象

{
    "Apple": 23,
    "Banana" 25,
    "Apple": 30,
    "Grapes": "No value",
    "Apple": 31
}

是否可以像下面的方法一样对其进行编码

dic = {}

for quantity,fruit in zip(ss.getRange(2,4,2,24).getDisplayValues(), ss.getRange(3,4,3,24).getValues()):
    dic[fruit] = key

上述方法在 python 中,但对于应用程序脚本,我需要将其转换为 javascript。

图纸图片供参考

标签: javascriptgoogle-apps-script

解决方案


根据您的 Python 代码,我假设您正在努力做到这一点:

var d = {};
var fruit    = ["Apple", "Banana", "Apple", "Grapes", "Apple"];
var quantity = [23, 25, 30, "No value", 31];

fruit.forEach((f,q) => d[f] = quantity[q]); // <-- the JS magic is here

console.log(d);

更新

如果您需要总结所有现有的键(水果),方法是:

var d = {};
var fruit = ["Apple", "Banana", "Apple", "Grapes", "Apple"];
var quantity = [23, 25, 30, "No value", 31];

fruit.forEach((f,q) => d[f] = d[f] ? d[f] + quantity[q] : quantity[q]);

console.log(d)

直接翻译成 Python 看起来像这样:

d = {}
fruits = ["Apple", "Banana", "Apple", "Grapes", "Apple"]
quantity = [23, 25, 30, "No value", 31]

for f,q in zip(fruits,quantity):
    try: d[f] += q
    except: d[f] = q

print(d) # output: {'Apple': 84, 'Banana': 25, 'Grapes': 'No value'}

并且可能您需要以某种方式处理“无价值”值。在这个简单的实现中,它们可能是错误的来源。


以防万一。这是处理“无价值”值的方法之一:

var s = ['No value', 'No value25', 25, '10', ''];

const get_num = s => s = (s == 'No value') ? s : +s.toString().replace(/\D+/g,'');

console.log(s.map(x => get_num(x))); // output: [ 'No value', 25, 25, 10, 0 ]


推荐阅读