如何使用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




