创建doc App脚本的PDF副本

时间:2016-08-03 13:43:22

标签: google-apps-script

我正在尝试根据电子表格中的条目创建PDF,其中包含以下基本流程。

  1. 填写电子表格
  2. 从菜单按钮(弹出询问工作号码)中取消提交
  3. 模板化文档获取副本并将单元格内容附加到副本文档中的表格。
  4. 复制文档将保存为特定文件夹中的PDF格式。
  5. doc的副本被删除。
  6. 我只想尝试获取在指定文件夹中创建的PDF的过程。它在我创建Doc的副本之前工作,只是使用模板,所以我不确定为什么它现在不起作用。任何输入都将受到赞赏,以及有关如何将工作表中的单元格数据附加到doc副本中的任何信息。纽比,以确保任何帮助将不胜感激。附加代码

    function createDoc () {
    
        var job = Browser.inputBox('Enter Job Number', 'Job Number',       Browser.Buttons.OK);
        var dtStr = Utilities.formatDate(new Date(), "GMT", "MMddyy")
        // create temp file before edited with spreadsheet data
        var tmpName = "tmpname"
        var folder = DriveApp.getFolderById('1C_k3MvoT33WhSXVNMmFQNFhqaW8')
        var tmpl = DriveApp.getFileById('225xZAECq0rkdJnsr4k9VjL91B7vgJh8Y- t9YrsbCEgc').makeCopy(tmpName).getID();
        // get document and make PDF in folder  
        var doc = DriveApp.getFileByID(tmpl).getAs("application/pdf");
        var pdf = doc.setName(job +"-"+dtStr+".pdf");
    
        folder.createFile(pdf)    
    }
    

2 个答案:

答案 0 :(得分:0)

我只在某些功能名称中看到一些拼写错误,请记住Google Apps脚本是一种基于JavaScript的脚本语言,所以:

  

JavaScript是一种区分大小写的语言。这意味着语言   关键字,变量,函数名称和任何其他标识符必须   总是输入一致的大写字母。

在这一行:

var tmpl = DriveApp.getFileById('').makeCopy(tmpName).getID();

.getID() D必须为小写,只需将其更改为.getId()

在这一行:

doc = DriveApp.getFileByID(tmpl).getAs("application/pdf");

.getFileByID() D也必须为小写,只需将其更改为.getFileById()

要删除临时文档,您可以使用removeFile()但首先需要获取文件,而不仅仅是id,所以我建议在获取副本的ID之前,获取文件然后获取文件的ID,如下所示:

var blob = DriveApp.getFileById('yourId').makeCopy(tmpName)
var tmpl = blob.getId();

然后在创建pdf之后,你可以删除:

folder.removeFile(blob);

要创建自定义菜单,official documentation有一些很好的例子。

修改

这是一个将表格附加到可以帮助您入门的Google文档的示例,cell变量可以将其更改为电子表格的数据范围:

function appendTable(){
  var document = DocumentApp.openById('docId');
  var body = document.getBody();
  var cells = [
      ['Row 1, Cell 1', 'Row 1, Cell 2'],
      ['Row 2, Cell 1', 'Row 2, Cell 2']
  ];
  body.appendTable(cells);
  document.saveAndClose();
}

答案 1 :(得分:0)

我已经包含了我用于同一目的的简单代码。这包括一个检查器,表示合并代码在过程中的位置。这在一次处理多行时很有用。它还提供了创建文件的URL。我使用此方式的方法是使用Google表单将数据发送到“表单响应”,然后使用=QUERY()将其发送到“合并数据”以继续执行功能。

此代码为您提供了Google Doc 最终的.pdf文件。如果您只想使用.pdf,只需在Google Doc变量上重复.setTrashed()方法即可。

我确实认识到代码中存在一些冗余,因为更复杂的版本包含更多if / else语句,条件检查器,数据处理等。您可以根据需要削减代码。

在我的Google表格中,前两列是提交的时间戳和提交人的姓名。这些用于命名文件。

function mergeApplication() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Merge Data");
  var range = sheet.getActiveRange();
  var formSheet = ss.getSheetByName("Form Responses");
  var lastRow = formSheet.getLastRow();
  var lastColumn = sheet.getMaxColumns();
  function checkAndComplete() {
    var urlColumn = lastColumn;
    var checkColumn = (urlColumn - 1);
    var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
    var check = checkRange.getBackgrounds();
    var red = "#ff0404";
    var yellow = "#ffec0a";
    var green = "#3bec3b";
    for (var i = 0; i < check.length; i++) {
      if (check[i] == green) {
        continue;
      } else {
        var statusCell = sheet.getRange((i+2), checkColumn, 1, 1);
        var urlCell = sheet.getRange((i+2), urlColumn, 1, 1);
        var dataRow = sheet.getRange((i+2), 1, 1, (lastColumn - 2));
        function mergeTasks() {    
          function docCreator() {
            var docTemplate = DriveApp.getFileById("docid");
            var docToUse  = docTemplate;
            var folderDestination = DriveApp.getFolderById("folderid");
            var name = sheet.getRange((i+2), 2, 1, 1).getValue();
            var rawSubmitDate = sheet.getRange((i+2), 1, 1, 1).getValue();
            var submitDate = Utilities.formatDate(rawSubmitDate, "PST", "MM/dd/yy");
            var docName = "File Name - " + name + " - " + submitDate;
            var docCopy = docToUse.makeCopy(docName, folderDestination);
            var docId = docCopy.getId();
            var docURL = DriveApp.getFileById(docId).getUrl();
            var docToSend = DriveApp.getFileById(docId);
            var docInUse = DocumentApp.openById(docId);
            var docBody = docInUse.getBody();
            var docText = docBody.getText(); 
            function tagReplace() {
              var taggedArray = docText.match(/\<{2}[\w\d\S]+\>{2}/g);
              var headerArray = sheet.getRange(1, 1, 1, (lastColumn - 2)).getValues();
              var dataArray = dataRow.getValues();
              var strippedArray = [];
              function tagStrip() {
                for (var t = 0; t < taggedArray.length; t++) {
                  strippedArray.push(taggedArray[t].toString().slice(2, -2));
                }
              }
              function dataMatch() {
                for (var s = 0; s < strippedArray.length; s++) {
                  for (var h = 0; h < headerArray[0].length; h++) {
                    if (strippedArray[s] == headerArray[0][h]) {
                      docBody.replaceText(taggedArray[s], dataArray[0][h]);
                    }
                  }
                }
                docInUse.saveAndClose();
              }
              tagStrip(); 
              dataMatch();
            }           
            tagReplace();
            statusCell.setBackground(yellow);
            var pdfDocBlob = docToSend.getAs(MimeType.PDF);
            var pdfDocInitial = DriveApp.createFile(pdfDocBlob).setName(docName);
            var pdfDoc = pdfDocInitial.makeCopy(folderDestination);
            pdfDocInitial.setTrashed(true);
            urlCell.setValue(docURL);
          }
          statusCell.setBackground(red);
          docCreator();
          statusCell.setBackground(green);
        }
        mergeTasks();
      }
    }
  }
  checkAndComplete();
}

此过程将系统地运行,每行大约需要5秒,并且将在驱动器的根目录下创建每个文件,但会快速从根目录中删除它。可能有一种更简单的方法可以节省垃圾中的空间,但我没有研究更有效的方法。