Google Sheets Apps Script如何在指定列最后非空单元格同行写文本
问题背景
- 本人为Apps Script新手,目前正在重温Java基础编码与Sheets公式相关知识
- 上千份发票分散存储在多个电子表格中,单份发票对应表格内的一个独立标签页,不同发票的数据行数不固定
- 核心需求:在F列最后一个非空单元格的同行A列单元格写入文本
End,供第三方开发的自动化流程识别使用。例:若F列最后非空单元格为F23,则需在A23填入End - 已尝试方案:使用
IF(OR(ISNUMBER(SEARCH(...类公式实现,但无法实现「仅在F列最后非空单元格对应行填充文本」的逻辑,暂未找到可行实现路径
可行解决方案
方案1:单表Sheets公式自动适配
不需要写脚本,直接在A列数据起始单元格输入数组公式即可自动匹配位置,后续F列数据增减时End的位置会自动更新,无需手动调整。
如果你的数据从第1行开始,直接在A1单元格输入以下公式按回车即可:
=ARRAYFORMULA(IF(ROW(F:F)=MAX(FILTER(ROW(F:F),F:F<>"")),"End",""))
如果你的表格有表头,数据从第2行开始,就把公式放在A2单元格,对应调整公式范围:
=ARRAYFORMULA(IF(ROW(F2:F)=MAX(FILTER(ROW(F2:F),F2:F<>"")),"End",""))
公式逻辑:
- 先筛选出F列所有非空单元格的行号,取最大值得到F列最后一个非空单元格的行位置
- 遍历A列对应范围,仅当行号和上述最后非空行号匹配时填入
End,其余单元格保持为空
方案2:Apps Script批量处理全量表格
如果需要处理上千个标签页,逐个加公式效率太低,可以用Apps Script一键批量完成所有表格的标记写入,操作步骤:
- 打开任意一个目标电子表格,点击顶部菜单栏「扩展程序」→「Apps Script」进入脚本编辑器
- 清空编辑器内默认的示例代码,粘贴以下代码:
function writeEndMark() { // 填入所有需要处理的电子表格ID,多个ID用英文逗号分隔 const fileIds = ["替换为你的第一个表格ID", "替换为你的第二个表格ID"]; const markText = "End"; fileIds.forEach(fileId => { const spreadsheet = SpreadsheetApp.openById(fileId); // 遍历当前电子表格下的所有标签页 spreadsheet.getSheets().forEach(sheet => { // 定位F列最后一个非空单元格行号 const fColValues = sheet.getRange("F:F").getValues(); const lastFilledRow = fColValues.findLastIndex(row => row[0] != null && row[0] !== "") + 1; if (lastFilledRow < 1) return; // 跳过F列无内容的无效表 // 在对应A列位置写入标记 sheet.getRange(lastFilledRow, 1).setValue(markText); }); }); }
- 将代码中
fileIds数组的占位内容替换为你实际存储发票的电子表格ID,表格ID可从表格网页URL中d/和/edit之间的字符串获取 - 点击编辑器顶部的运行按钮,首次运行按弹窗指引完成账号授权即可,脚本会自动遍历所有指定表格的标签页完成标记写入。
提示:运行脚本前建议先备份原始表格数据,避免误操作导致内容丢失。
内容的提问来源于stack exchange,提问作者Matt Orzillo
相关产品推荐
相关产品推荐

