我需要使用新合并的文档来创建pdf,将其添加到特定的gdrive文件夹,注意GSheet上的pdf网址,然后删除合并的GDoc

时间:2019-06-12 23:57:00

标签: google-apps-script google-sheets google-docs

我看到了许多其他有关“邮件合并”的文章,但它们都没有经过我试图实现的所有步骤。

  1. 从Gsheet获取所有行数据,并将其合并到复制的Gdoc(通过模板)
  2. 使用新合并的Gdoc生成一个副本作为PDf
  3. 获取pdf并作为附件发送到电子邮件中
  4. 将pdf文件保存到特定文件夹(按日期列出的文件夹名称)下的Gdrive
  5. 删除生成PDF的Gdoc。

我现在正在尝试在一个脚本中完成所有这些步骤。我认为有更好的方法涉及不同的触发器,但是我将其尽快组合在一起,因为它需要在工作中实现。因此,现在我试图回过头来改进代码(因为我无法实现上面所有需要的步骤)。

截至目前,我已经能够生成合并后的文档,并在电子邮件中以PDF格式发送。我无法在Gdrive中保存新创建的Gdoc的PDF副本,我只保存了Gdoc版本(我不想要,我只想保存PDF)。

此外,目前我仅将所有内容保存到一个文件夹中。理想情况下,我想遍历父文件夹,看看是否已经存在一个文件夹(具有相同的名称..这是一个日期),然后创建该文件夹(如果不存在)。

在过去的几天里,我一直在谷歌上搜索并尝试了很多事情,但是我对GAS的这种“模糊”想法一无所知,并且不确定是否需要使用某种身份验证在脚本中访问以便在脚本仍在运行时访问生成的PDF。

var rowNum = ss.getDataRange().getLastRow();
var tstamp = sheet.getRange(rowNum, 1, 1, 9).getValue();
var pname = sheet.getRange(rowNum, 2, 1, 9).getValue();
var phone = sheet.getRange(rowNum, 3, 1, 9).getValue();
var email = sheet.getRange(rowNum, 4, 1, 9).getValue();
var address = sheet.getRange(rowNum, 5, 1, 9).getValue();
var city = sheet.getRange(rowNum, 6, 1, 9).getValue();
var state = sheet.getRange(rowNum, 7, 1, 9).getValue();
var zip = sheet.getRange(rowNum, 8, 1, 9).getValue();
var dob = sheet.getRange(rowNum, 9, 9, 9).getValue();
var rdate = sheet.getRange(rowNum, 10, 1, 10).getValue();
var dobf = Utilities.formatDate(dob, "GMT-7", "MM/dd/yyyy");

//Start GOOGLE DOC
var docTemplateId = "1ZtOZ6c****KF86JKHeqpeH****TcLG-3laftW2SEirHA";

//Make A Copy Of The Template To Folder Then Grab ID
var newDoc = DriveApp.getFileById(docTemplateId).makeCopy(pname, destinationFolder);  var documentId = newDoc.getId();

//Rename The Copied Template
var newName = DriveApp.getFileById(documentId).setName("Sales Lead | " + pname);

//Open The Copied Doc
var openNewFile = DocumentApp.openById(documentId);

//Get ID of New Doc
var newId = openNewFile.getId();

//Get ID of New Doc
var body = openNewFile.getBody();

//Get URL of New Doc (used to print out download link on Gsheet upon completion)
var docURL = openNewFile.getUrl();

//Replace the tags on the Gdoc Template
body.replaceText("{{Timestamp}}", tstamp);
body.replaceText("{{Name}}", pname);
body.replaceText("{{Phone Number}}", phone);
body.replaceText("{{Email}}", email);
body.replaceText("{{Street Address}}", address);
body.replaceText("{{City}}", city);
body.replaceText("{{State}}", state);
body.replaceText("{{Zip Code}}", zip);
body.replaceText("{{Date of Birth}}", dobf);
body.replaceText("{{Date Received}}", today);

//Add Users
var addUsers = openNewFile.addEditor('example@gmail.com');
var save = openNewFile.saveAndClose();

//Generate PDF
var pdf = DriveApp.getFileById(newId).getAs('application/pdf').getBytes();
var pdfURL = DriveApp.getFileById(newId).getUrl();

//Create Attachment
var attach = {fileName: 'Sales Lead | ' + pname, content:pdf, mimeType:'application/pdf'};

//Write "Today's" Date
var writeDate = sheet.getRange("J"+rowNum).setValue(today);

//Write Lead "Complete" And Add "Link"
var complete = sheet.getRange("K"+rowNum).setValue("ASBsw Lead Generated");

//Write URL to GSheet
var writeURL = sheet.getRange("L"+rowNum).setValue(pdfURL);

//Send Email
MailApp.sendEmail("company@mycompany.com", "Sales Lead | " + pname + " | " + today, "See Attached PDF", {
  attachments: [attach],
  name: newName
});

缺少的步骤

  1. 使用GSheet数据中的'dobf'变量浏览GDrive文件夹(在父文件夹中)并检查是否存在(子)文件夹。如果不存在,请创建它。如果是这样,请将新的PDF移动到该文件夹​​。

  2. 该代码当前正在将GDoc保存到GDrive。相反,我需要GDoc的PDF副本,将其保存到指定的文件夹,然后删除GDoc

  3. 将新创建的PDF的下载URL打印到GSheets ...而不是打印GDoc url(就像我现在一样)。

P.S。我知道在某些情况下这不是很“干”的代码。因此,经验丰富的编码人员将不希望看到上面列出的重复内容。我大约10个月前开始学习编码,而大约一周前开始学习GAS。我以前使用附加组件来完成所有这些工作,上周突然变黑了!这导致我们公司的自动化在整个区域范围内崩溃,...(不好说)是不好的。我花了几天时间购买了Udemy课程,并学习了GAS,并在几天前恢复了自动化并开始运行(我们使用了4个其他类似的合并)。 对于那些正在阅读本文的经验丰富的编码人员,我深表歉意。

1 个答案:

答案 0 :(得分:0)

@Tanaike,听起来您对自己太刻薄了。你一定带领我走了正确的道路。这很重要。这是我在寻找的其余答案。...

    //Generate PDF from merged GDoc
    var doc = DriveApp.getFileById(newId);
    var pdf = doc.getBlob();
    //Declare the folder to search for within parent
    var folderSearch = parFolder.searchFolders('title contains "'+aDate+'"');
    //If child folder found
    if(folderSearch.hasNext()){
      //Grab that folder
      var folNext = folderSearch.next();
      //Add newly generated pdf
      var addPdf = folNext.createFile(pdf);
    } else {
      //If folder not found, create one
      var createFold = parFolder.createFolder(aDate);
      //Grab the newly created folder
      var folNext = parFolder.getFoldersByName(aDate).next();
      //Add newly generate pdf
      var addPdf = folNext.createFile(pdf);
    }

    //Get url to view pdf
    var pdfURL = "https://drive.google.com/open?&export=download&id=" + addPdf.getId();

    //Trash the merged GDoc
    doc.setTrashed(true);

    //Print the new pdf url to the GSheet
    var writeURL = sheet.getRange("AT"+rowNum).setValue(pdfURL);