如何使用应用程序脚本从Google文档中删除页面

时间:2019-05-13 16:52:21

标签: google-apps-script

我创建了一个包含多个页面的模板。使用模板后,我要自动删除所有未使用的页面。

这是它的工作方式。我创建了一个包含25个页面的证书模板,其中包含用于名称和其他详细信息的占位符。每页是一个证书。处理完数据后,下面的代码将占位符替换为Google表格中的数据。完成后-我要删除文档中所有多余的页面-例如:如果仅修改5个模板页面,则要从文档中删除其余20个模板页面。

欢迎任何其他改进建议,因为这是我的第一个应用程序脚本。

添加以澄清问题:

该脚本从具有数百行数据的Google表格中获取数据。例如,如果需要创建5个证书,则脚本将获取所有数据并循环并查找某个标志(cert_data [i] [6] == 1)以标识应用于证书的数据行。 。找到该标志后,该行中的数据将存储在变量中,并用于替换模板文件中的占位符。一旦替换了所有标记行中的数据-在此示例中,仅替换5个模板页。因此,模板中将有20个页面尚未使用-我想删除这些页面。

function createDocument() {

  //Setting ID for database
  var SPREADSHEET_ID = "doc ID"
  var spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
  var worksheet = spreadsheet.getSheetByName("Sheet1");

  var cert_data = worksheet.getDataRange().getValues();  
  //Setting template ID
  var templateId = 'template ID goes here';

  //Make a copy of the template file
  var documentId = DriveApp.getFileById(templateId).makeCopy().getId();


  //Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();

  //Foramt date
  var curDate = Utilities.formatDate(new Date(), "GMT+1", "dd MMMM yyyy")

  var d = 0;


  //Looping through all the data that is in the Google Sheet
  for(var i = 1; i < cert_data.length ; i++){

    var curdata = cert_data[i][6];

    //Checking if the row data is to be used to create certificate
    if (cert_data[i][6] == 1) {
      var training_type = cert_data[i][12];
      var hours = cert_data[i][9];
      var user_name = cert_data[i][1];
      var NIC = cert_data[i][3];
      var date_completed = Utilities.formatDate(cert_data[i][8], "GMT+1", "dd MMMM yyyy");
      var company = cert_data[i][2];
      var cert_number = cert_data[i][0];
      var date_now = curDate;

      //Setting training names

      if (training_type == "01G") {training_type = "Basic First Aid" + String.fromCharCode(10) + "& Automated External" + String.fromCharCode(10) + "Defibrillator Certificate"; var file_name = 'AED Training';}

      if (training_type == "01B") {var file_name = 'Refresher Receipts';}

      d++;

      //Insert the data into the file
      body.replaceText('{training_type' + d + '}', training_type);
      body.replaceText('{hours' + d + '}', hours);
      body.replaceText('{name' + d + '}', user_name);
      body.replaceText('{NIC' + d + '}', NIC);
      body.replaceText('{date_completed' + d + '}', date_completed);
      body.replaceText('{company' + d + '}', company);
      body.replaceText('{cert_numb' + d + '}', cert_number);
      body.replaceText('{date_now' + d + '}', date_now);
    }
  }

    //d is the number of pages used from the template file
    //I want to delete all the balance pages (i.e. 25-d = x)
    //Rename the copied file
    DriveApp.getFileById(documentId).setName(file_name + ' - ' + company);

}

1 个答案:

答案 0 :(得分:0)

  • 您的Google文档的每个页面都由分页符分隔。
  • 您要从最后一页顺序删除几页Google文档。
  • 要删除的页面数由脚本决定。

如果我的理解是正确的,那么该示例脚本如何?该脚本的流程如下。

流量:

  1. 检索文档正文中的段落。
  2. 检索每个段落中的元素。分页符包含在该段中。
  3. 按顺序从最后一页删除元素。
  4. 当分页符数与deletePages相同时,脚本将停止。

通过此流程,可以从最后一页顺序删除几页。

示例脚本:

请复制并粘贴以下脚本,并设置变量deletePagesid。然后,运行脚本。

function myFunction() {
  var deletePages = 3; // Please set this.
  var id = "### documentId ###"; // Please set this.

  var paragraph = DocumentApp.openById(id).getBody().getParagraphs();
  var counter = 0;
  for (var i = paragraph.length - 1; i >= 0; i--) {
    for (var j = 0; j < paragraph[i].getNumChildren(); j++) 
      if (paragraph[i].getChild(j).getType() == DocumentApp.ElementType.PAGE_BREAK) counter++;
    paragraph[i].clear();
    if (counter == deletePages) break;
  }
}

注意:

  • 如果要从最后一页删除5页,请设置var deletePages = 5
  • 您还可以将myFunction(deletePages)之类的函数用作方法。那时,请删除var deletePages = 3;
  • 您也可以使用DocumentApp.getActiveDocument()代替DocumentApp.openById(id)

参考文献: