如何在我的代码中将 DocsList 更新为 DriveApp

IT技术 javascript google-apps-script google-docs-api
2021-03-11 20:46:07

由于 DocsList 的贬值,我的脚本从 Google Drive 中的模板生成 pdf 文档并根据电子表格中的列将其通过电子邮件发送给收件人今天停止工作。请参阅此处:https : //developers.google.com/google-apps/documents-list/

我已尝试按照本指南https://developers.google.com/drive/web/migration进行更新以使用 DriveApp 更新 DocsList 的所有实例,但我无法使其正常工作。有人可以帮我更新这个脚本以使其正常工作吗?我在此脚本中有 6 个“DocsList”实例,我能够正确更新其中一些实例,但其他一些(例如“addFile”)似乎需要不同的格式。即使在尝试简单地查找“DocsList”并将其替换为“DriveApp”后,我仍收到以下错误消息:

“类型错误:在对象 ProofOfCredit_CNZDTVR44N.pdf 中找不到函数 addFile。(第 45 行,文件“ProofOfCreditCode”)”

我将不胜感激任何建议和帮助,因为这种折旧破坏了我的 5 个脚本,这些脚本与这个脚本几乎相同。

var docTemplate = "1JAPmsrPRrRwXCVAli229C5J7Kr4xaOnfO2rmGqvYyhU"; 
var docName     = "ProofOfCredit";

function onFormSubmit(e) {
   var first_name = e.values[1];
   var last_name = e.values[2];
   var customer_email = e.values[3];
   var order_number = e.values[4];
   var brand = e.values[5];
   var amount = e.values[6];
   var date_of_credit = e.values[7];
   var auth_code = e.values[8];
   var last_4 = e.values[9];
   var request_id = e.values[10];
   var rep_name = e.values[11];
   var copyId = DocsList.getFileById(docTemplate)
                .makeCopy(docName+'_'+order_number)
                .getId();   

   var copyDoc = DocumentApp.openById(copyId);
   var copyBody = copyDoc.getActiveSection();

   copyBody.replaceText('keyFirst', first_name);
   copyBody.replaceText('keyLast', last_name);
   copyBody.replaceText('keyBrand', brand);
   copyBody.replaceText('keyAmount', amount);
   copyBody.replaceText('keyCreditdate', date_of_credit);
   copyBody.replaceText('keyAuth', auth_code);
   copyBody.replaceText('keyRep', rep_name);
   copyBody.replaceText('keyOrder', order_number);
   copyBody.replaceText('keyCClast4', last_4);
   copyBody.replaceText('keyRequestID', request_id);
   var todaysDate = Utilities.formatDate(new Date(), "GMT", "MM/dd/yyyy"); 
   copyBody.replaceText('keyTodaysDate', todaysDate);

   copyDoc.saveAndClose();

   var pdf = DocsList.getFileById(copyId).getAs("application/pdf"); 
   var folder = DocsList.getFolder('Proof of Credit');
   var movefile = DocsList.createFile(pdf);
   movefile.addToFolder(folder);
   movefile.removeFromFolder(DocsList.getRootFolder());
   var subject = "Proof of Credit regarding Order Number: " + order_number;
   var body    = "Hello " + first_name + " " + last_name + "," + "<br /><br />" 
   + "Thank you for calling " + brand + " Support. The attached document contains information " 
   + "for you to reference related to the credits we have issued back to your original form of payment." + "<br /><br />" 
   + "If you have any further questions or require additional assistance please let us know." + "<br /><br />" 
   + "Regards," + "<br /><br />" 
   + rep_name + ", Payments Department" + "<br />" 
   + "test@test.com";
   var cc = "test@test.com";
   MailApp.sendEmail(customer_email, subject, body, {htmlBody: body, attachments: pdf, cc: cc}); 
   DocsList.getFileById(copyId).setTrashed(true);
}
2个回答

许多DriveApp方法与DocsList. 因此,在许多情况下,您可以简单地替换DocsListDriveApp.

getFolder()方法出现问题

var folder = DocsList.getFolder('Name of your folder');

在这种情况下,简单地替换DocsListwithDriveApp会给你带来问题。没有getFolder()方法DriveApp在 Google 云端硬盘中,您可以拥有多个名称相同(但 ID 不同)的文件和文件夹。旧的DocsList,getFolder()方法没有考虑这种情况。使用DriveApp,您仍然可以按名称搜索文件夹,但返回的是Folder Iterator. DriveApp按名称获取文件夹的方法名称略有不同;它是“文件夹”,末尾有一个“s”。 getFoldersByName(name)复数,不是单数。因此,即使在 98% 的情况下,按名称获取文件夹只会产生一个文件夹,您仍然需要处理Folder Iterator. 不需要循环遍历文件夹迭代器。您可以只获取第一个文件夹。只需使用该next()方法而不使用编程循环。

文件夹迭代器

所以,我建议你不要只是更换DocsListDriveApp除了名字得到一个文件夹的情况。阅读文档,修复那行代码,然后运行它。如果你得到一个错误,VIEW执行纪录,它可能会告诉你什么行代码失败。如果您仍然需要帮助,请始终发布失败的代码行。

此外,没有addToFolder()新的 DriveApp Folder 类的方法。

文件夹类

您需要将其更改为:

folder.addFile(moveFile);

addFile() 方法

谢谢桑迪。我按照你的建议做了,用“DriveApp”替换了“DocsList”的所有字符串。我不得不更改 var folder = DocsList.getFolder('Proof of Credit'); 到 var 文件夹 = DriveApp.getFolderById('0B3nrCN8N5OBceFQ5WGVVLWVoNjQ'); 但我仍然收到以下错误:4/21/15 1:12 PM onFormSubmit TypeError:在对象 ProofOfCredit_CNZDTVR44N.pdf 中找不到函数 addToFolder。(第 45 行,文件“ProofOfCreditCode”)
2021-05-08 20:46:07
谢谢!我想我能像你回答的那样弄清楚。我替换了 var pdf = DocsList.getFileById(copyId).getAs("application/pdf"); var folder = DocsList.getFolder('信用证明'); var movefile = DocsList.createFile(pdf); movefile.addToFolder(文件夹); movefile.removeFromFolder(DocsList.getRootFolder()); 与 var pdf = DriveApp.getFileById(copyId); var theblob = pdf.getBlob().getAs('application/pdf'); var folder = DriveApp.getFolderById('0B3nrCN8N5OBceFQ5WGVVLWVoNjQ'); var movefile = folder.createFile(theblob); 它似乎正在起作用。
2021-05-15 20:46:07

DriveApp 中没有为 File 对象“添加到文件夹”的方法。相反,您需要获取文件夹(它看起来像是存储在 var 文件夹中),然后使用 Folder 对象添加文件。它看起来像这样:

var folder = DriveApp.getFolderById(string id);
var movefile = DocsList.createFile(pdf);
folder.addFile(moveFile);

您可以使用 Folder 对象将文件添加到 Folder,但 DriveApp 没有 File 对象将自身添加到文件夹的方法。

您是否打算DocsList在答案中仍然使用已弃用的方法调用?
2021-04-16 20:46:07