You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何使用setValues()处理分散单元格区域,将公式转换为值?

如何使用setValues()处理分散单元格区域,将公式转换为值?

兄弟,我太懂你这种循环单个单元格超时的憋屈了!之前我也踩过一模一样的坑,一百多个单元格循环下来直接触发超时,改用批量操作的setValues()绝对是找对了方向,不过分散的单元格确实得用点小技巧——核心是借助Google Apps Script里的RangeList对象来批量处理这些不连续的单元格,具体代码和逻辑我给你理得明明白白:

完整实现代码

const rangeArray = ["A1", "B3", "C12"];

function convertFormulasToValues() {
  // 获取当前活动工作表,也可以用getSheetByName("你的工作表名")指定特定表
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // 把分散的单元格地址转换成RangeList对象,这是处理多分散范围的关键
  const rangeList = sheet.getRangeList(rangeArray);
  
  // 第一步:批量获取所有单元格的计算后的值
  // 先拿到每个单独的Range对象数组
  const individualRanges = rangeList.getRanges();
  // 遍历每个Range,取出计算后的结果(单个单元格的getValues()返回[[值]],所以取[0]得到[值])
  const cellValues = individualRanges.map(range => range.getValues()[0]);
  
  // 第二步:批量把值设置回去,直接覆盖原来的公式
  rangeList.setValues(cellValues);
}

为什么这方法能解决超时问题?

原来的循环setValue(getValue())每个单元格单独发起一次服务请求,150个单元格就有150次请求,很容易达到Google Apps Script的调用上限触发超时;而上面的写法:

  • RangeList把所有分散单元格打包成一个对象处理
  • 整个流程只会发起3次左右的服务请求(获取RangeList、批量取值、批量设值),调用次数骤减,完全不会超时
  • rangeList.setValues()会自动把值对应到每个分散的单元格,根本不用你手动匹配位置

额外小提示

要是你的rangeArray里不光有单个单元格,还混着连续区域(比如"A1:A5"),这段代码也能直接用,RangeList会自动识别并处理每个区域的内容,兼容性拉满!

备注:内容来源于stack exchange,提问作者Yoko

火山引擎 最新活动