如何使用应用脚本从 google 文档中删除页面

How to delete a page from a google doc using app script

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

这是它的工作原理。我创建了一个 25 页的证书模板,其中包含名称和其他详细信息的占位符。每一页都是一张证书。遍历数据后,下面的代码将占位符替换为 Google Sheet 中的数据。一旦完成 - 我想删除文档中的所有额外页面 - 例如:如果只修改了 5 个模板页面,我想从文档中删除剩余的 20 个模板页面。

欢迎提出任何其他改进建议,因为这是我的第一个 App 脚本。

补充澄清问题:

该脚本从 Google Sheet 中获取数据,其中包含数百行数据。例如,如果需要创建 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);

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

如果我的理解是正确的,这个示例脚本怎么样?该脚本的流程如下

流量:

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

通过这个流程,可以从最后一页依次删除几页。

示例脚本:

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

function myFunction() {
  var deletePages = 3;
  var id = "### documentId ###";

  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++;
    if (counter < deletePages)
      paragraph[i].clear();
    else if (counter == deletePages){
      paragraph[i].getChild(paragraph[i].getNumChildren() - 1).removeFromParent();
      break;
    }
  }
}

注:

  • 如果要从最后一页删除5页,请设置var deletePages = 5
  • 你也可以像myFunction(deletePages)一样使用这个函数作为方法。届时请去掉var deletePages = 3;.
  • 您也可以使用 DocumentApp.getActiveDocument() 代替 DocumentApp.openById(id)
  • 开始,我更新了示例脚本。

参考文献: