我一直在努力获取一个用于设计游戏派系的电子表格模板,并开始学习宏来做到这一点。一切都很顺利,直到我开始遇到一些奇怪的错误,其中电子表格中的输出与代码编辑器中的输出不匹配。
输入如下所示:
'C=>bd \\ C=>Bd'
代码编辑器中的输出如下所示:
V: 3.5, S: 0, P: 0
电子表格中的输出如下所示:
V: NaN, S: NaN, P: NaN
两者都是该字符串插值的乘积:
V: ${sides.side2.value - sides.side1.value}, S: ${sides.side2.ships}, P: ${sides.side2.points}
测试函数时,我逐字复制单元格中的输入,并将参数设置为等于复制的单元格内容。
有人知道为什么这些会有所不同吗?
如果需要,愿意发布有关代码的更多详细信息,但就目前情况而言,我不确定它是否相关。
编辑:添加脚本+输入和预期输出
案例:
C=>bd \\ C=>Bd
'V: 3.5, S: 0, P: 0'
'V: NaN, S: NaN, P: NaN'
let cubes = [
// smalls
{ letter: 'b', value: 1},
{ letter: 'w', value: 1},
{ letter: 'g', value: 1},
//larges
{ letter: 'K', value: 1.5},
{ letter: 'Y', value: 1.5},
{ letter: 'B', value: 1.5},
// ultra
{ letter: 'U', value: 3},
// wilds
{ letter: 'c', value: 1},
{ letter: 'C', value: 1.5},
{ letter: 'd', value: 2},
{ letter: 'D', value: 3},
//non cubes
{ letter: 's', value: 1},
{ letter: '$', value: 1},
{ letter: '0', value: 0},
{ letter: '*', value: 0}, // faction specific token
]
.map(x => x.letter === 's' ? {...x, isShip: true} : {...x, isShip: false})
.map(x => x.letter === '$' ? {...x, isPoint: true} : {...x, isPoint:false})
/**
* Prints the converter delta as `{V: value, S: ships, P: points}`
* @param {string} s Converter Equation.
* @return {string} Converter Delta
* @customfunction
*/
function SC_PRINT(s) {
let sides;
if (s.includes(`\\`)) {
let arr = s.split(`\\`).map(x => x.trim());
sides = arr.reduce((prev, curr) => {
let c = getSides(curr);
return {
side1: {
value: prev.side1.value + c.side1.value,
ships: prev.side1.ships + c.side1.ships,
points: prev.side1.points + c.side1.points,
},
side2: {
value: prev.side2.value + c.side2.value,
ships: prev.side2.ships + c.side2.ships,
points: prev.side2.points + c.side2.points,
}
};
}, {side1:{value: 0, ships: 0, points: 0}, side2:{value: 0, ships: 0, points: 0}})
} else {
sides = getSides(s)
}
if (!sides.side1 && !sides.side2) {
return `V: 0, S: 0, P: 0`
}
return `V: ${sides.side2.value - sides.side1.value}, S: ${sides.side2.ships}, P: ${sides.side2.points}`;
}
/**
* Splits a converter string into two sides
* @param {string} s Converter Equation
* @return {object} The splitted converter
*/
function getSides(s) {
if (!s) {
return {
side1: '',
side2: ''
}
}
if (s.includes('-')) {
sides = s.split('->')
}
if (s.includes('=')) {
sides = s.split('=>')
}
let side1 = getValue(sides[0]);
let side2 = getValue(sides[1]);
return {
side1: side1,
side2: side2
}
}
/**
* Maps a string to an output
* @param {string} side A side of a converter
* @returns {object} Object representing the value, ships and points of a particular side
*/
function getValue (side) {
side = side
return side.split('').reduce((prev, curr) => {
let cube = cubes.filter(c => c.letter === curr)[0];
if (cube.isShip) return {...prev, ships: prev.ships + 1}
else if (cube.isPoint) return {...prev, points: prev.points + 1}
else return {...prev, value: prev.value + cube.value}
}, {value: 0, ships: 0, points: 0})
从您显示脚本的
@customfunction
来看,我猜测您正在使用函数 SC_PRINT
作为自定义函数,如 =SC_PRINT("C=>bd \\ C=>Bd")
。
在这种情况下,我认为
"C=>bd \\ C=>Bd"
的输入值给出为"C=>bd \\\\ C=>Bd"
。这样,let arr = s.split(
\).map(x => x.trim());
返回[ 'C=>bd', '', 'C=>Bd' ]
。我猜这就是你当前问题'V: NaN, S: NaN, P: NaN'
的原因。
为了解决这个问题,下面的修改如何?在本次修改中,修改了函数
SC_PRINT
。
let arr = s.split(`\\`).map(x => x.trim());
let arr = s.split(/\\{1,}/g).map(x => x.trim());
或
let arr = s.split(`\\`).map(x => x.trim()).filter(String);
当我测试这个修改时,得到了以下结果。