You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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());
  }
}

第三步:设置触发器

  1. 打开Google脚本编辑器(表单或电子表格的"扩展程序"->"Apps Script")
  2. 点击左侧的"触发器"图标(闹钟形状)
  3. 点击"添加触发器":
    • 选择函数:onFormSubmit
    • 选择部署类型:Head
    • 选择事件源:表单提交
    • 选择事件类型:来自表单的提交
  4. 保存并授权(第一次需要按照提示完成权限验证,允许脚本访问你的邮箱、电子表格和Trello数据)

注意事项

  • 表单提交的记录默认是追加到电子表格最后一行,所以用lastRow获取S列计数器是准确的
  • 如果你的表单响应表名不是"表单响应",记得替换成实际名称
  • 第一次运行脚本时,需要完成Google的权限授权流程,这是正常操作

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:01:36