【问题标题】:How to delete a page from a google doc using app script如何使用应用脚本从谷歌文档中删除页面
【发布时间】:2019-05-13 16:52:20
【问题描述】:

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

这就是它的工作原理。我创建了一个包含 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);

}

【问题讨论】:

  • 能否提供any unused page的详细信息?顺便说一句,如果您想使用 Google Apps 脚本实现此目的,您能否提供您当前的脚本?这样,它将帮助用户思考您的解决方案。
  • 添加细节 - @Tanaike
  • 感谢您添加信息。我可以问你更新的问题吗? 1. 请解释一下你的脚本。如果您的脚本有问题,也请出示。 2. 我无法理解only 5 template pages are modified 使用脚本。怎么知道5个模板页面是否被脚本修改了?
  • 在问题和代码中添加了更多的 cmets。脚本没有问题。 @田池
  • 感谢您的回复和补充信息。但不幸的是,我还无法想象您的情况。所以我现在想不出你的解决方案。当我能完全理解你的情况时,我会想你的解决方案。对于这种情况和我糟糕的英语水平,我深表歉意。

标签: google-apps-script google-docs


【解决方案1】:
  • 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)
  • 来自@derekantrican's suggestion,我更新了示例脚本。

参考资料:

【讨论】:

  • 非常感谢您提供示例脚本 - 非常感谢。我不知道如何使您的答案成为公认的答案! @Tanaike
  • @m mustho 感谢您的回复。我很高兴你的问题得到了解决。我也可以从你的问题中学习。也谢谢你。
  • 这似乎有一个问题,它清除了最后一段。例如,如果我将“This is page #”放在 5 个不同的页面上,然后使用 deletePages = 3 运行,我将得到 2 个页面,但只有第一页上的文本(即“This is page 2” on第二页将消失)
  • @derekantrican 感谢您的回复。我可以确认您的示例脚本。我更新了两个脚本。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多