使用对象键与数据集进行比较并插入对象值
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
参考文献:
- how to access individual elements of a javascript object literal?
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
- 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”列。
参考文献:
提前致谢!
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
参考文献:
- how to access individual elements of a javascript object literal?
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
- 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”列。