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

Google Script导出最新4个Sheet为PDF报错:getLastUpdated非函数,求解决方案

问题解决:按工作表最后修改时间导出最新4个为PDF

错误原因分析

你遇到的getLastUpdated is not a function错误,核心原因有两点:

  • sheet.getParent()返回的是Spreadsheet对象(属于SpreadsheetApp API体系),而getLastUpdated()是DriveApp.File类的专属方法,跨API调用必然报错。
  • Google Sheets没有原生API可以直接获取单个工作表(Sheet)的最后修改时间——Drive仅追踪整个表格文件的修改时间,不会单独记录每个sheet的修改行为。原代码用整个文件的更新时间排序所有工作表,逻辑完全无效,因为所有sheet的父文件都是同一个,排序后顺序不会变化。

可行实现方案

要实现按单个工作表的最后修改时间排序,必须通过脚本手动追踪每个sheet的修改时间,具体步骤如下:

1. 初始化日志表(仅需运行一次)

创建一个隐藏的工作表,用来存储每个sheet的最后修改时间:

function setupLogSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  if (!ss.getSheetByName('SheetUpdateLog')) {
    var logSheet = ss.insertSheet('SheetUpdateLog');
    logSheet.hideSheet(); // 隐藏日志表,避免误编辑
    logSheet.getRange(1, 1).setValue('工作表名称');
    logSheet.getRange(1, 2).setValue('最后修改时间');
  }
}

2. 设置编辑触发脚本

创建触发器,每当任意工作表被编辑时,自动更新日志表中的对应修改时间:

function onEdit(e) {
  var ss = e.source;
  var editedSheet = e.range.getSheet();
  var sheetName = editedSheet.getName();
  var logSheet = ss.getSheetByName('SheetUpdateLog');

  // 查找当前工作表在日志中的记录行
  var namesRange = logSheet.getRange(2, 1, logSheet.getLastRow() - 1, 1);
  var names = namesRange.getValues();
  var rowIndex = -1;
  
  for (var i = 0; i < names.length; i++) {
    if (names[i][0] === sheetName) {
      rowIndex = i + 2; // 日志数据从第2行开始
      break;
    }
  }

  var now = new Date();
  if (rowIndex === -1) {
    // 新增未记录过的工作表
    logSheet.appendRow([sheetName, now]);
  } else {
    // 更新已有工作表的修改时间
    logSheet.getRange(rowIndex, 2).setValue(now);
  }
}

注意:需要给onEdit设置可安装触发器(而非简单触发器),避免权限限制。设置路径:Google Sheets编辑器 → 扩展程序 → Apps脚本 → 左侧「触发器」→ 添加触发器,选择onEdit函数,事件类型选「从电子表格提交」→ 「编辑时」。

3. 导出最新4个工作表为PDF

修改原函数,读取日志表的时间数据对工作表排序,然后导出PDF:

function downloadLatest4SheetsAsPDF() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var logSheet = ss.getSheetByName('SheetUpdateLog');

  // 将日志数据转为映射表:工作表名称 → 最后修改时间
  var logData = logSheet.getRange(2, 1, logSheet.getLastRow() - 1, 2).getValues();
  var updateTimeMap = {};
  logData.forEach(function(row) {
    updateTimeMap[row[0]] = row[1];
  });

  // 按修改时间倒序排序工作表,无记录的工作表放在最后
  sheets.sort(function(a, b) {
    var timeA = updateTimeMap[a.getName()] || new Date(0);
    var timeB = updateTimeMap[b.getName()] || new Date(0);
    return timeB.getTime() - timeA.getTime();
  });

  // 获取最新的4个工作表
  var latestSheets = sheets.slice(0, 4);
  var targetFolder = DriveApp.getFolderById('1I3VMLALdtTa_pIfVw9UKpZK3A4OCjL2M');

  // 批量导出PDF
  latestSheets.forEach(function(sheet) {
    var sheetName = sheet.getName();
    // 通过指定sheetId导出单个工作表的PDF,比直接getBlob更可靠
    var pdfBlob = ss.getBlob({
      format: 'pdf',
      sheetId: sheet.getSheetId(),
      exportFormat: 'pdf'
    }).setName(sheetName + '.pdf');

    targetFolder.createFile(pdfBlob);
  });
}

操作步骤总结

  1. 在Apps脚本编辑器中运行setupLogSheet(),创建隐藏日志表。
  2. 设置可安装触发器关联onEdit函数。
  3. 运行downloadLatest4SheetsAsPDF(),即可将最新修改的4个工作表导出为PDF到指定Drive文件夹。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:34:58