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
相关产品推荐
相关产品推荐

