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

时间:2015-04-21 15:50:28

标签: javascript google-apps-script google-docs-api

我的脚本从Google云端硬盘中的模板生成pdf文档,并根据电子表格中的列通过电子邮件将其通过电子邮件发送给收件人,因为DocsList已弃用。见这里:https://developers.google.com/google-apps/documents-list/

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

" TypeError:无法在对象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 个答案:

答案 0 :(得分:10)

许多DriveApp方法与DocsList相同。因此,在许多情况下,您只需将DocsList替换为DriveApp

旧的getFolder()方法会出现问题。

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

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

Folder Iterator

因此,我建议您执行只需将DocsList替换为DriveApp,除非是按名称获取文件夹。阅读文档,修复该行代码,然后运行它。如果您收到错误查看 执行TRANSCRIPT ,它可能会告诉您哪行代码失败了。如果您仍然需要帮助,请始终发布哪行代码失败。

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

Folder Class

您需要将其更改为:

folder.addFile(moveFile);

addFile() Method

答案 1 :(得分:-1)

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

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

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