You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets自定义函数MyPortfolio2突然失效求助

问题分析与修复方案

原函数的核心问题

  1. 全局变量污染:循环变量i未声明为局部变量,属于全局变量,极易和表格中其他公式、函数的全局变量产生冲突,这大概率是恢复历史版本后仅能工作一秒就报错的原因。
  2. 变量未初始化:total_price未提前初始化,虽不影响正常逻辑,但可能引发不可预知的异常。
  3. 无效数据处理缺失:输入范围若包含空单元格或非数值内容,函数会直接报错。

修复后的函数代码

function MyPortfolio2(tickers, values, price) {
  let total = [];
  let sums = {};
  let average = {};
  
  // 遍历交易数据,处理每一条记录
  for(let i = 0; i < tickers.length; i++) {
    // 跳过空行或无效数据
    if(!tickers[i] || !values[i] || !price[i]) continue;
    
    let t = tickers[i].toString().trim();
    let val = Number(values[i]);
    let p = Number(price[i]);
    
    // 跳过Cash记录
    if(t === "Cash") continue;
    
    // 处理持仓计算
    if(sums.hasOwnProperty(t)) {
      sums[t] += val;
      // 仅在买入时更新平均价(val>0)
      if(val > 0) {
        let totalPrice = sums[t] * average[t] + val * p;
        average[t] = totalPrice / (sums[t] + val);
      }
    } else {
      sums[t] = val;
      average[t] = p;
    }
  }
  
  // 过滤掉持仓为0或负数的股票,整理输出格式
  for(let ticker in sums) {
    if(sums[ticker] > 0) {
      total.push([ticker, sums[ticker], average[ticker]]);
    }
  }
  
  return total;
}

关键改动说明

  • 用let声明所有局部变量,彻底避免全局变量冲突问题。
  • 增加空值判断,跳过无效行,防止空单元格导致的类型转换错误。
  • 对ticker字符串做trim()处理,避免因单元格空格导致的股票代码识别错误。
  • 提前将values和price转换为数值并赋值给局部变量,提升代码可读性与稳定性。

测试验证

用你提供的输入数据测试:

tickersvalueprice
TSLA4200
TSLA1400
GOOG1100
DIS1150
DIS-1100

调用=MyPortfolio2(tickers, value, price)后,预期输出与你描述一致:

TICKERSHARESAVG_PRICE
TSLA5240
GOOG1100

后续排查建议

如果替换后仍出现问题,检查:

  • 输入范围是否包含合并单元格,合并单元格会导致tickers/values/price的数组长度不一致。
  • 表格中是否有其他自定义函数使用了全局变量,可能仍存在冲突。

内容的提问来源于stack exchange,提问作者Liu Ed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:03:16