基于Google Script实现表单提交邮件格式化、Trello卡片创建及列S计数器引用需求
解决方案:两个Google Workspace自动化需求的实现
没问题,我帮你搞定这两个自动化场景,直接上可复用的代码和详细说明:
一、获取电子表格特定列中最后修改单元格的值
这里分两种常见场景,分别给你对应的实现方案:
场景1:实时监听特定列的修改(自动触发)
用onEdit简单触发器,只要目标列的单元格被修改,就自动捕获修改后的值:
function onEdit(e) { const targetColumn = 19; // 替换成你要监控的列号(比如S列是19,C列是3) if (e.range.columnStart === targetColumn) { const lastModifiedValue = e.value; const cellAddress = e.range.getA1Notation(); console.log(`列${targetColumn}刚修改的单元格是${cellAddress},值为:${lastModifiedValue}`); // 这里可以把值存入变量、写入其他单元格,或者对接后续业务逻辑 } }
注意:简单触发器有一定权限限制,如果需要访问外部服务或修改其他文档,改成可安装触发器即可。
场景2:手动查询特定列最后修改的非空单元格
如果需要主动获取(比如定时任务里调用),用这个函数遍历列,找到最后修改的有效单元格:
function getLastModifiedCellInColumn(columnLetter) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const columnIndex = columnToIndex(columnLetter); const lastRow = sheet.getLastRow(); // 从最后一行往上找,跳过空单元格 for (let i = lastRow; i >= 1; i--) { const cell = sheet.getRange(i, columnIndex); const cellValue = cell.getValue(); if (cellValue !== "") { const modifiedTime = cell.getLastUpdated(); console.log(`列${columnLetter}最后修改的非空单元格:${cell.getA1Notation()},值:${cellValue},修改时间:${modifiedTime}`); return cellValue; } } return null; // 列中无有效内容时返回 } // 辅助工具:列字母转列号(比如"S"转19) function columnToIndex(columnLetter) { let index = 0; for (const char of columnLetter.toUpperCase()) { index = index * 26 + (char.charCodeAt(0) - 64); } return index; }
调用示例:getLastModifiedCellInColumn("S") 就能拿到S列最后修改的非空单元格值。
二、表单提交时自动发格式化邮件+创建Trello卡片(含S列计数器)
这个需求需要结合表单提交触发器、电子表格数据读取、邮件发送和Trello API调用,一步到位:
第一步:准备Trello凭证
先去Trello个人设置里获取以下信息:
- API Key(在"API Keys"页面生成)
- API Token(点击"Generate Token"生成,需要授权访问你的Trello数据)
- 目标看板ID和列表ID(可以从看板/列表的URL里提取,比如URL末尾的一串字符)
第二步:完整代码实现
// 替换成你的Trello配置信息 const TRELLO_API_KEY = "你的Trello API Key"; const TRELLO_API_TOKEN = "你的Trello Token"; const TRELLO_BOARD_ID = "目标看板的ID"; const TRELLO_LIST_ID = "要添加卡片的列表ID"; function onFormSubmit(e) { try { // 1. 获取表单提交对应行的S列计数器值 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("表单响应"); // 替换成你的表单响应表名 const lastRow = sheet.getLastRow(); const counterValue = sheet.getRange(lastRow, 19).getValue(); // S列是第19列,对应刚提交的记录行 // 2. 构建格式化邮件内容 const emailSubject = `新表单提交 #${counterValue}`; let emailBody = `<h3>新表单提交详情(编号:${counterValue})</h3><ul>`; // 遍历表单字段,生成美观的邮件列表 e.response.getItemResponses().forEach(itemResp => { emailBody += `<li><strong>${itemResp.getItem().getTitle()}:</strong>${itemResp.getResponse()}</li>`; }); emailBody += "</ul>"; // 发送邮件(替换成收件邮箱) MailApp.sendEmail({ to: "your-recipient@example.com", subject: emailSubject, htmlBody: emailBody, noReply: true // 可选:用noreply邮箱发送,避免收到回复 }); // 3. 创建Trello卡片 const cardName = `表单提交 #${counterValue}`; const cardDesc = `提交详情:\n${e.response.getItemResponses().map(item => `${item.getItem().getTitle()}: ${item.getResponse()}`).join("\n")}`; const trelloApiUrl = `https://api.trello.com/1/cards?key=${TRELLO_API_KEY}&token=${TRELLO_API_TOKEN}`; const payload = { name: cardName, desc: cardDesc, idList: TRELLO_LIST_ID, idBoard: TRELLO_BOARD_ID }; const requestOptions = { method: "post", contentType: "application/json", payload: JSON.stringify(payload) }; // 调用Trello API创建卡片 UrlFetchApp.fetch(trelloApiUrl, requestOptions); console.log(`成功创建Trello卡片:${cardName}`); } catch (error) { console.error("处理表单提交时出错:", error); // 可选:发送错误通知给自己,及时排查问题 MailApp.sendEmail("your-email@example.com", "表单自动化流程出错", error.toString()); } }
第三步:设置触发器
- 打开Google脚本编辑器(表单或电子表格的"扩展程序"->"Apps Script")
- 点击左侧的"触发器"图标(闹钟形状)
- 点击"添加触发器":
- 选择函数:
onFormSubmit - 选择部署类型:
Head - 选择事件源:
表单提交 - 选择事件类型:
来自表单的提交
- 选择函数:
- 保存并授权(第一次需要按照提示完成权限验证,允许脚本访问你的邮箱、电子表格和Trello数据)
注意事项
- 表单提交的记录默认是追加到电子表格最后一行,所以用
lastRow获取S列计数器是准确的 - 如果你的表单响应表名不是"表单响应",记得替换成实际名称
- 第一次运行脚本时,需要完成Google的权限授权流程,这是正常操作
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

