Google 表格的行为与脚本不同

问题描述 投票:0回答:1

我一直在努力获取一个用于设计游戏派系的电子表格模板,并开始学习宏来做到这一点。一切都很顺利,直到我开始遇到一些奇怪的错误,其中电子表格中的输出与代码编辑器中的输出不匹配。

输入如下所示:

'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})
  
google-sheets google-apps-script
1个回答
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);

测试:

当我测试这个修改时,得到了以下结果。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.