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

Google Apps Script未按时触发函数问题排查及定时调用方法

问题排查与定时执行方案

一、原代码执行失败的可能原因及修复

1. 代码执行时机问题

原代码中,时间判断和函数调用逻辑位于函数外部的顶层代码。在Google Apps Script中,顶层代码仅会在以下场景执行:

  • 打开脚本编辑器时
  • 手动运行某个函数时
  • 触发器触发某个函数时

它不会在后台持续运行,因此即使时间过了16:10,若没有触发脚本的操作,这段判断逻辑根本不会执行。

2. 变量作用域与错误处理缺失

  • 所有变量(如ss、sheet、conn)未使用var/let/const声明,会成为全局变量,可能引发意外冲突或错误。
  • UpdateDatabase函数没有错误捕获机制,任何一步失败(如找不到工作表、JDBC连接失败、SQL语法错误)都会导致函数静默终止,无法得知具体问题。

3. SQL注入风险

原代码直接将data拼接进SQL语句,存在SQL注入漏洞,可能导致数据库异常或数据泄露。


二、修复后的代码

带错误处理的UpdateDatabase函数

function UpdateDatabase() {
  try {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = ss.getSheetByName("SCRIPT");
    if (!sheet) {
      console.error("未找到名为'SCRIPT'的工作表");
      return;
    }
    const data = sheet.getRange("A2").getValue();

    const server = "give.herosite.pro";
    const port = '3306';
    const dbName = "oncjsznl_wp921";
    const username = "oncjsznl_wp921";
    const password = "xxxxxxxxx";
    const url = `jdbc:mysql://${server}:${port}/${dbName}?characterEncoding=UTF-8`;

    const conn = Jdbc.getConnection(url, username, password);
    // 使用预编译语句避免SQL注入
    const query = `UPDATE \`my_table\` SET \`Script\` = ?`;
    const preparedStmt = conn.prepareStatement(query);
    preparedStmt.setString(1, data);
    preparedStmt.executeUpdate();
    console.log("数据库表更新成功");

    preparedStmt.close();
    conn.close();
  } catch (error) {
    console.error("数据库更新失败:", error);
  }
}

手动触发的时间检查函数(可选)

若需要手动触发检查并执行更新,可使用以下函数:

function CheckAndRunUpdate() {
  const now = new Date().getTime();
  const d = new Date();
  const year = d.getFullYear();
  const month = d.getMonth();
  const date = d.getDate();
  const targetTime = new Date(year, month, date, 16, 10, 0).getTime();

  const distance = targetTime - now;

  // 仅在当天16:10之后执行一次
  if (distance < 0 && new Date(now).getDate() === date) {
    UpdateDatabase();
  }
}

三、定时执行方案(推荐)

Google Apps Script提供了时间驱动触发器,可直接设置在指定时间自动执行UpdateDatabase函数,无需手动检查时间。

方法1:手动创建触发器

  1. 打开脚本项目,点击左侧栏的时钟图标(触发器)。
  2. 点击「添加触发器」。
  3. 选择要运行的函数:UpdateDatabase。
  4. 事件源选择「时间驱动」。
  5. 类型选择「日计时器」,然后选择包含16:10的时间段(如「下午4:00到下午5:00」)。

方法2:通过脚本创建精确触发器

运行以下函数一次,即可创建每天16:10执行的触发器:

function createDailyTrigger() {
  // 删除已存在的同名触发器,避免重复
  const existingTriggers = ScriptApp.getProjectTriggers();
  for (const trigger of existingTriggers) {
    if (trigger.getHandlerFunction() === "UpdateDatabase") {
      ScriptApp.deleteTrigger(trigger);
    }
  }

  // 创建每天16:10的触发器
  ScriptApp.newTrigger("UpdateDatabase")
    .timeBased()
    .atHour(16)
    .nearMinute(10)
    .everyDays(1)
    .create();
}

四、调试步骤

  1. 打开Apps Script控制台的「执行」标签,查看是否有失败的执行记录,根据错误信息排查问题。
  2. 手动运行UpdateDatabase函数,确认其能正常执行(如数据库连接、工作表访问是否正常)。
  3. 检查「SCRIPT」工作表是否存在,且A2单元格有有效数据。
  4. 验证数据库是否允许Google Apps Script的IP地址访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:01:14