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

Google Apps Script运行报错:TypeError: templateDoc.makeCopy is not a function

解决Google Apps Script中TypeError: templateDoc.makeCopy is not a function错误

错误原因

报错的核心问题是:DriveApp.getFilesByName('CustomerDocumentTemplate')返回的是FileIterator(文件迭代器),而非单个File对象。makeCopy是File对象专属的方法,迭代器没有这个方法,因此调用时触发TypeError。

解决方案

方案1:使用文件ID获取模板(推荐)

代码中已经定义了templateId变量但未实际使用,直接通过文件ID获取单个File对象是最可靠的方式(因为文件ID唯一,不会出现同名文件混淆的问题):

function createMailMergeDocument() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("Form responses 1");
  var data = sheet.getDataRange().getValues();
  var header = data.shift();

  var customerNameColumnIndex = header.indexOf("EnglishName");
  var templateId = "1tq29zF0i2R9oV12hkOhNOIWGhe8kvp6T4EHKlM4nGxk";

  for (var i = 0; i < data.length; i++) {
    var customerName = data[i][customerNameColumnIndex];
    var folderName = customerName.replace(/\s+/g, "_");
    // 替换原templateDoc获取逻辑,用ID直接取单个文件
    var templateDoc = DriveApp.getFileById(templateId);
    var copiedDoc = templateDoc.makeCopy(folderName).setName(customerName + ".docx");
    var body = copiedDoc.getBody();
    body.replaceText("{{EnglishName}}", data[i][header.indexOf("EnglishName")]);
    body.replaceText("{{身份證號碼/ 護照號碼}}", data[i][header.indexOf("身份證號碼/ 護照號碼")]);

    copiedDoc.saveAndClose();
  }
}

方案2:从文件迭代器中提取文件(若必须用文件名)

如果确实需要通过文件名获取模板,需先判断迭代器中是否存在文件,再取出第一个匹配的文件:

function createMailMergeDocument() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("Form responses 1");
  var data = sheet.getDataRange().getValues();
  var header = data.shift();

  var customerNameColumnIndex = header.indexOf("EnglishName");
  var templateId = "1tq29zF0i2R9oV12hkOhNOIWGhe8kvp6T4EHKlM4nGxk";

  for (var i = 0; i < data.length; i++) {
    var customerName = data[i][customerNameColumnIndex];
    var folderName = customerName.replace(/\s+/g, "_");
    var templateIterator = DriveApp.getFilesByName('CustomerDocumentTemplate');
    
    // 判断迭代器是否有文件
    if (templateIterator.hasNext()) {
      var templateDoc = templateIterator.next();
      var copiedDoc = templateDoc.makeCopy(folderName).setName(customerName + ".docx");
      var body = copiedDoc.getBody();
      body.replaceText("{{EnglishName}}", data[i][header.indexOf("EnglishName")]);
      body.replaceText("{{身份證號碼/ 護照號碼}}", data[i][header.indexOf("身份證號碼/ 護照號碼")]);

      copiedDoc.saveAndClose();
    } else {
      // 抛出错误提示,避免静默失败
      throw new Error(`未找到名为CustomerDocumentTemplate的模板文件`);
    }
  }
}

内容的提问来源于stack exchange,提问作者Kin Man Hui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:37:33