Google App Script - 合并多个文档,删除所有换行符并通过电子邮件以 pdf 形式发送

2024-02-10

我正在使用 Google App Script,并已成功将一个文件夹中的多个文档合并到一个文档中,并删除所有换行符,同时保持所有样式不变。

我需要一些帮助的是,在removeMultipleLineBreaks(element) 函数完成后如何通过邮件发送文档。

有人可以帮我存档这个吗: (这是连接到表单的电子表格脚本,电子表格接收表单响应)

onFormSubmit 触发 mergeDocument。合并所有文档后,删除MultipleLineBreaks,完成后,使用表单中提交的电子邮件将文档的 pdf 版本发送给用户。

这是正在运行的脚本代码。

function mergeGoogleDocs() {
// set folder ID were we should look for files to merge  
  var folder = DriveApp.getFolderById('0BwqMAWnXi8hMmljM3FZpaowb1'); 
  var docIDs = [];
  var files = folder.getFiles();

  while (files.hasNext()){
    file = files.next();
    docIDs.push(file.getId());
  }
// check if we have some ids  
  Logger.log(docIDs); 
// set document id of doc which will contain all merged documents  
  var baseDoc = DocumentApp.openById('0BwqMAWnXi8hMmljM3FZpaowb1');
// clear the whole document and start with empty page
  baseDoc.getBody().clear();
  var body = baseDoc.getActiveSection();

  for (var i = 1; i < docIDs.length; ++i ) {
    var otherBody = DocumentApp.openById(docIDs[i]).getActiveSection();    
    var totalElements = otherBody.getNumChildren();
    for( var j = 0; j < totalElements; ++j ) {
      var element = otherBody.getChild(j).copy();
      var type = element.getType();
      if( type == DocumentApp.ElementType.PARAGRAPH )
        body.appendParagraph(element);
      else if( type == DocumentApp.ElementType.TABLE )
        body.appendTable(element);
      else if( type == DocumentApp.ElementType.LIST_ITEM )
        body.appendListItem(element);
      else
        throw new Error("Unknown element type: "+type);
    }
  }
// after merging all docs, invoke function to remove all line breaks in the just merged document
  removeMultipleLineBreaks();
}


function removeMultipleLineBreaks(element) {
  if (!element) {
    // set document id of doc where to remove all line breaks 
    element = DocumentApp.openById('0BwqMAWnXi8hMmljM3FZpaowb1').getBody();
  }
  var parent = element.getParent();
  // Remove empty paragraphs
  if (element.getType() == DocumentApp.ElementType.PARAGRAPH 
      && element.asParagraph().getText().replace(/\s/g, '') == '') {
    if (!(parent.getType() == DocumentApp.ElementType.BODY_SECTION 
         && parent.getChildIndex(element) == parent.getNumChildren() - 1)) {
      element.removeFromParent();
    }
  // Remove duplicate newlines in text
  } else if (element.getType() == DocumentApp.ElementType.TEXT) {
    var text = element.asText();
    var content = text.getText();
    var matches;
    // Remove duplicate carriage returns within text.
    if (matches = content.match(/\r\s*\r/g)) {
      for (var i = matches.length - 1; i >= 0; i--) {
        var match = matches[i];
        var startIndex = content.lastIndexOf(match);
        var endIndexInclusive = startIndex + match.length - 1;
        text.deleteText(startIndex + 1, endIndexInclusive);
      }
    }
    // Grab the text again.
    content = text.getText();
    // Remove carriage returns at the end of the text.
    if (matches = content.match(/\r\s*$/)) {
      var match = matches[0];
      text.deleteText(content.length - match.length, content.length - 1);
    }
    // Remove carriage returns at the start of the text.
    if (matches = content.match(/^\s*\r/)) {
      var match = matches[0];
      text.deleteText(0, match.length - 1);
    }
  // Recursively look in child elements
  } else if (element.getNumChildren) {
    for (var i = element.getNumChildren() - 1; i >= 0; i--) {
      var child = element.getChild(i);
      removeMultipleLineBreaks(child);
    }
  }
}

调用邮件功能:

  }
  // after merging all docs, invoke function to remove all line breaks in the just merged document
  removeMultipleLineBreaks();

  //email document
  emailDocument();
}

电子邮件功能:

function emailDocument() {
  //Replace this email address with your own email address
  var email = "[email protected] /cdn-cgi/l/email-protection"; 

  var fileToAttach = DriveApp.getFileById('Put your file ID here').getAs('application/pdf');

  var message = "This is a test message";
  var subject = "New Merged Document";

 // Send an email with an attachment: a file from Google Drive
 MailApp.sendEmail(email, subject, message, {
     attachments: [fileToAttach]
 });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google App Script - 合并多个文档,删除所有换行符并通过电子邮件以 pdf 形式发送 的相关文章

  • 有没有办法在javascript中代理(拦截)一个类的所有方法?

    我希望能够在类本身的构造函数内代理类的所有方法 class Boy constructor proxy logic do something before each call of all methods inside class like
  • 为什么 useReducer 调度会导致重新渲染?

    假设我实现一个简单的全局加载状态 如下所示 hooks useLoading js import React createContext useContext useReducer from react const Context crea
  • Typescript:匿名函数内可能未定义的变量

    太长了 在匿名函数中使用变量之前检查变量仍然 TS 警告变量可能未定义 在下面的代码示例中变量baseDirId检查是否未定义 然后传递给 array map 函数 但 TS 发出警告baseDirId可以是未定义的 Typescript
  • 在 ajax 请求上启用 jQuery contextMenu 项

    我正在尝试更新上下文菜单 http medialize github com jQuery contextMenu docs htmlitem 如果 ajax 请求改变了我的 div 内容 这就是我的意思 我有一个这样的 div div c
  • 使用javascript滚动滚动条或鼠标滚轮后触发事件

    我想知道是否可以触发事件after使用滚动条或鼠标滚轮 或在触摸设备上滑动 时滚动页面 基本上 我想检测用户何时停止滚动 以便我可以进行 AJAX 加载 而不是在滚动时加载 看起来jQuery s scroll 每次用户滚动时都会触发 并且
  • 用更好的模式替换开关(Javascript)

    我必须升级我的应用程序以根据用户类型和角色属性显示页面 目前 我使用一个简单的 switch 语句来根据用户类型来执行此操作 例如 switch type case a return CONSTANT ONE case b return C
  • 如何在其他呼叫运行时以编程方式合并呼叫(电话会议)

    我的要求是这样的 假设我当时正在拨打一个号码 并且我想以编程方式拨打另一个号码 到目前为止 我所做的是 当某些呼叫已经进行时 我能够呼叫特定号码 例如 假设我正在拨打号码 123 1 分钟后 通过使用Alarm Manger我触发一个事件来
  • ASP.NET 验证控件和 Javascript 确认框

    我有一个使用 NET 服务器端输入验证控件的页面 此页面还有一个 javascript 确认框 在提交表单时会触发该确认框 当前 当选择 提交 按钮时 会出现 javascript 确认框 一旦确认 就会触发 ASP NET 服务器端验证控
  • 在动态创建的元素的onclick函数的属性中传递一个字符串

    我试图在动态创建的锚元素的 onClick 事件处理函数的参数中传递一个字符串 请参阅小提琴http jsfiddle net shmdhussain bXYe4 http jsfiddle net shmdhussain bXYe4 我无
  • 指定 HTML5 输入类型 = 日期的值输出?

    我想将本机日期选择器添加到我的应用程序中 该应用程序当前使用遗留的本地系统 日期输入支持尚未广泛普及 但如果我可以基于兼容性提供这两种实现 那就太理想了 有没有办法指定 HTML 日期选择器给出的值的输出 歌剧的默认设置是yyyy mm d
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • NodeJS - 将相对路径转换为绝对路径

    In my 文件系统我的工作目录在这里 C temp a b c d 在 b bb 下有文件 tmp txt C temp a b bb tmp txt 如果我想从工作目录转到该文件 我将使用以下路径 bb tmp txt 如果该文件不存在
  • 基于范围内变量的角度设置形式动作

    我一直在尝试设置一个搜索表单 可以在其中注入表单操作属性 在我的表格中我有
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 如何在数据表角度中基于 JSON 动态填充表值?

    我在用着Angular 数据表 https l lin github io angular datatables 我需要能够根据返回的数据动态创建表 换句话说 我不想指定列标题 Example json数据 id 2 city Baltim
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • chrome 选项卡/窗口中的 window.open 行为

    我有一小段 javascript 旨在打开两个或更多选项卡 这在 FF 和 IE 中工作正常 但 chrome 会在新窗口而不是选项卡中打开第二个窗口 它不依赖于 url 因为我已经尝试过使用两个相同的 url 第一个在选项卡中打开 第二个
  • WebpackError:ReferenceError:Gatsby 上未定义窗口

    我已经在互联网上进行了大量搜索 但无法解决这个问题 我正在使用 Gasby 开发静态页面 但遇到此错误 WebpackError ReferenceError window is not defined 我的线索是 这与我正在使用的引导 模
  • Firebase 身份验证和实时应用程序数据库如何保护自身安全?

    从一般开发的角度来看 我很好奇如何保护在线资源的访问 我们使用以下 Firebase 配置参数初始化 Web 应用程序 apikey authdomain projectid databaseurl messagesenderid 服务器如

随机推荐

  • 找不到类“android.support.v4.widget.SwipeRefreshLayout”[重复]

    这个问题在这里已经有答案了 我不断收到此错误 它导致我的应用程序崩溃 尝试实现新的 v4 滑动刷新布局 我已经更新了支持库 sdk 问题是什么 找不到类 android support v4 widget SwipeRefreshLayou
  • 如何使用 boost.python 公开对齐的类

    当尝试像这样公开对齐的类时 class declspec align 16 foo public void foo method BOOST PYTHON MODULE foo module class
  • GWT 中共享包的重要性

    我意识到 GWt 不会编译不在客户端包中的类 但共享包的重要性是什么 我需要在这个包中放入哪些类 我需要上哪些课程 放入这个包中 客户端和服务器都使用的任何逻辑或数据类型 这将使您免于复制双方的代码 并可能保留逻辑和数据类型持续的
  • HttpRequestMessage 内容中的文件名

    我实现了 POST Rest 服务来将文件上传到我的服务器 我现在遇到的问题是我想按类型限制上传的文件 举例来说 我只想允许上传 pdf 文件 我试图做的是 Task
  • 从 Eclipse 菜单 Window -> Show View 中删除视图名称

    我需要删除从 窗口 gt 显示视图 菜单创建的视图的名称 快捷方式 并将它们添加为单独的菜单 有什么方法可以从 窗口 gt 显示视图 菜单中隐藏 删除其条目 您可以从 自定义透视 菜单可见性 选项卡的 显示视图 菜单中添加 删除任何视图 以
  • docker在aws ecs中运行程序参数

    我在 Amazon 的 ECS 中有一个工作容器 它将程序作为任务运行 我想传递一些程序参数 就像我在本地运行时所做的那样docker run 我已经成功地在 ECS 的容器配置中传递了一个新的入口点 就像我在docker run命令行 不
  • 由于定义顺序,常量初始化“令人惊讶”

    阅读时关于 constexpr 的幻灯片 http accu org content conf2007 Maurer C 0x Generating Constant Expression pdf简介是关于 使用 const 进行令人惊讶的
  • 在C语言中连接字符串,哪种方法更有效?

    我遇到了这两种连接字符串的方法 共同部分 char first First char second Second char both malloc strlen first strlen second 2 方法一 strcpy both f
  • Apple Watch:状态栏高度

    有人知道 Apple Watch 状态栏的大小吗 无论是在 Apple Watch 人机界面指南还是 Apple Watch 编程指南中 我都无法在文档中找到这样的价值 所以 我已经测量过它们了 38mm 19pt 38px 42mm 21
  • char* - 为什么指针中没有地址?

    我有一个基本问题char 我不明白 char aString Hello Stackoverflow 指针指向字符链的第一个字符 cout lt lt aString H 但为什么整个字符串都保存在指针中呢 cout lt lt aStri
  • 写入内存映射文件后,什么会更新 mtime?

    我在 Linux 上使用 XFS 并且有一个内存映射文件 每秒写入一次 我注意到文件 mtime 由watch ls full time 周期性但不规则地变化 mtimes之间的差距似乎在2到20秒之间 但并不一致 系统上几乎没有其他东西在
  • 如何在php中显示特定mysql数据库中的所有表名

    我正在尝试显示数据库中的所有表名 这是我的代码 所显示的一切1对于每个条目 我不知道为什
  • Dictionary.ContainsKey 返回 False,但想要 True

    namespace Dic public class Key string name public Key string n name n class Program static string Test Key a new Key A K
  • 如何使用Java程序连接MS Access数据库?

    我想编写一个程序来从 MS Access 数据库检索数据 我写的程序如下 package db import java sql public class MSaccess archive public static void main St
  • 从流中获取父对象

    我有这门课 public class StructUserType extends UserType MembersList membersList new MembersList public List
  • Java 中的 Swagger 规范验证

    我正在尝试验证一些可能包含 swagger 规范的字符串 我正在尝试使用 swagger 解析器 下面的代码不起作用 我只收到消息 属性不是类型object swagger 规范是从 xml 文件中读取的 swaggerXml nodeLi
  • Webpack - 加载块 0 失败

    我的一些用户收到此错误 未处理的拒绝消息 加载块 0 失败 堆栈 正在加载 块 0 在 HTMLScriptElement n 处失败 问题是 我没有成功复制它 我已经有一段时间出现这个错误了 对于相同的用户来说 every他们进入网站的时
  • 如何在 Laravel 5 迁移中向表(而不是列)添加注释?

    如何在 Laravel 5 迁移中向表 或列 添加注释 我目前知道如何向列添加评论 例如 table gt tinyInteger status gt comment 0 requested 1 rejected 1 confirmed 但
  • 我打开的文档(选项卡)在 VS2010 SP1 中不断消失

    在 VS 2010 中 当我关闭解决方案并在第二天重新打开它后 我打开的所有文档仍然会打开 正是我想要的 安装 SP1 后 每次打开解决方案时 所有文档都会关闭 无论我将它们保留在什么状态 这是预期的行为 错误还是存在我不知道的设置 我怎样
  • Google App Script - 合并多个文档,删除所有换行符并通过电子邮件以 pdf 形式发送

    我正在使用 Google App Script 并已成功将一个文件夹中的多个文档合并到一个文档中 并删除所有换行符 同时保持所有样式不变 我需要一些帮助的是 在removeMultipleLineBreaks element 函数完成后如何