Google Sheets自定义函数MyPortfolio2突然失效求助
问题分析与修复方案
原函数的核心问题
- 全局变量污染:循环变量
i未声明为局部变量,属于全局变量,极易和表格中其他公式、函数的全局变量产生冲突,这大概率是恢复历史版本后仅能工作一秒就报错的原因。 - 变量未初始化:
total_price未提前初始化,虽不影响正常逻辑,但可能引发不可预知的异常。 - 无效数据处理缺失:输入范围若包含空单元格或非数值内容,函数会直接报错。
修复后的函数代码
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转换为数值并赋值给局部变量,提升代码可读性与稳定性。
测试验证
用你提供的输入数据测试:
| tickers | value | price |
|---|---|---|
| TSLA | 4 | 200 |
| TSLA | 1 | 400 |
| GOOG | 1 | 100 |
| DIS | 1 | 150 |
| DIS | -1 | 100 |
调用=MyPortfolio2(tickers, value, price)后,预期输出与你描述一致:
| TICKER | SHARES | AVG_PRICE |
|---|---|---|
| TSLA | 5 | 240 |
| GOOG | 1 | 100 |
后续排查建议
如果替换后仍出现问题,检查:
- 输入范围是否包含合并单元格,合并单元格会导致
tickers/values/price的数组长度不一致。 - 表格中是否有其他自定义函数使用了全局变量,可能仍存在冲突。
内容的提问来源于stack exchange,提问作者Liu Ed
相关产品推荐
相关产品推荐

