使用对象键与数据集进行比较并插入对象值

Using Object keys to compare against data set and insert object values

提前致谢!

Goal/Help 请求:

我想使用我的代码中的数组(我认为它是一个对象文字?)并且如果 完全匹配 来自数据集(食物列),它将数组中的配对答案插入“配对”列。

Issue/Thoughts:

我想我需要使用 Object.values()& Object.keys()。我很难通过数据使我的函数达到 运行 并进行比较....我认为 for 语句可以工作,但它似乎不是这样,我的 forEach 代码说它不是一个函数我有点迷失了如何让它像使用 i++ 一样遍历每个相应的行。

Sheet 脚本前:

期望输出:

数据:

Food Pairing Cost
apple toast
apple cheese
orange
orange peel
apple apple apple
orange orange
orange toast

代码:

    function apples() {
      sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
          const combo = {
                          'apple toast':'juice',
                          'apple cheese':'water',
                          'orange':'milk',
                          'orange peel':'OJ'
                          }
    const food = sheet.getRange("A2:A5").getValues().flat();
    const foodrownum = sheet.getDataRange().getNumRows();
    const pairing = sheet.getRange("B2:B5");

    var keys = Object.keys(combo)

    combo.forEach(function(item,index,array){
          if(item===food){
              sheet.getRange(2,2,foodrownum).setValue(Object.values(combo));
          }
    });

    }//end of function

参考文献:

  1. how to access individual elements of a javascript object literal?
  2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
  3. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#object_literals

你可以试试这个:

function apples() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  const combo = {
    'apple toast': 'juice',
    'apple cheese': 'water',
    'orange': 'milk',
    'orange peel': 'OJ'
  }
  const food = sheet.getRange("A2:A8").getValues().flat();
  const pairing = sheet.getRange("B2:B8");

  const entries = Object.entries(combo);

  for (let i = 0; i < food.length; i++) {
    if (food[i] in combo) {
      pairing.getCell(i + 1, 1).setValue(combo[food[i]]) //Adds the value to each row depending on the key value
    }
    else {
      pairing.getCell(i + 1, 1).setValue('Not found') 
/*This since both combo and your sheet elements are not the same size
and getCell specifies where we want to insert the value of the key found*/
    }
  }
}

至于为什么会出现错误,基本上它的实现方式不正确,因为 per documentation

修改点:

  • 在循环中使用setValue时,处理成本变高。 Ref
  • combo 是 JSON 对象。在这种情况下,您不能直接使用 forEach.
  • sheet.getRange(2,2,foodrownum).setValue(Object.values(combo)) 的情况下,当使用您的 combo 值时,只有 juice 被放入“B”列。
  • 我认为在您的情况下,使用 combo 的 JSON 对象从“A”列的值创建输出值的方法可能是合适的。

当这些点反映到一个示例脚本中,就变成了下面这样。

示例脚本:

function apples() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  const combo = {
    'apple toast': 'juice',
    'apple cheese': 'water',
    'orange': 'milk',
    'orange peel': 'OJ'
  };
  const range = sheet.getRange("A2:A" + sheet.getLastRow());
  const values = range.getValues().map(([a]) => [combo[a.trim()] || null]);
  range.offset(0, 1).setValues(values);
}
  • 当此脚本为 运行 时,使用 combo 和“A”列的值,新值将放入“B”列。

参考文献: