收到电子邮件时电子表格自动更新(发布/订阅)但信息错误[关闭]

2024-01-28

我在 Google Cloud Platform 上设置了第一个 Pub/Sub,它使用 Gmail API 在每次收到电子邮件时更新我的​​电子表格

(有关如何执行此操作的更多信息,请参阅我之前的问题) https://stackoverflow.com/questions/76790331/how-to-update-function-so-it-responds-to-certain-emails-automatically/76803573#76803573

但是,下面的 doPost 函数在我的电子表格上返回类似以下内容: "2023 年 8 月 4 日 10:01:59"、"8011555761044464"、"{"电子邮件地址":"[电子邮件受保护] /cdn-cgi/l/email-protection","historyId":37309620}"

我还是个新手,但我希望电子表格包含发件人的信息和主题行。如何改进我的脚本?

// ************************* POST *************************

function doPost (e) {

const message = JSON.parse(e.postData.getDataAsString()).message;
const data = Utilities.newBlob(Utilities.base64Decode(message.data)).getDataAsString();
const ss = SpreadsheetApp.openById("MYSHEET").getSheetByName("Borghers Emails");
ss.appendRow([new Date(), message.message_id, data]);
return 200;

};

// ************************* ENROLL EMAIL *************************

function enrollEmail() {

try {

  const watchRes = {
    labelIds: ["INBOX"],
    labelFilterAction: "include",
    topicName: "projects/myproject/topics/gmailTrigger"
  };

  const response = Gmail.Users.watch(watchRes, "me");
  console.log(response);


} catch (error) {
  console.log(error);
}

};

编辑:这是更新的代码这确实有效,谢谢田池!但是,我认为 Pub/Sub 和我的脚本之间存在沟通不畅,因为当我发送一封测试电子邮件时,电子表格将进入无限循环,在该循环中更新工作表并且不会停止。我不确定如何与 Pub/Sub 通信以确保一次只发生一条消息。请参阅下面的我的脚本和工作表上的结果:

function doPost(e) {

  const message = JSON.parse(e.postData.getDataAsString()).message;
  const data = JSON.parse(Utilities.newBlob(Utilities.base64Decode(message.data)).getDataAsString());

  const { historyId } = data;
  const { history } = Gmail.Users.History.list("me", { startHistoryId: historyId });

  if (history.length > 0) {
    const messageId = history[0].messages[0].id;
    const msg = GmailApp.getMessageById(messageId);
    const ss = SpreadsheetApp.openById("MYSHEET").getSheetByName("Email Log");
    ss.appendRow([new Date(), messageId, msg.getFrom(), msg.getSubject()]);
  }

  return ContentService.createTextOutput("ok");

}

我相信您的目标如下。

  • 您已经完成了在收到电子邮件时通过发布/订阅推送到 Web 应用程序的设置。
  • 您想通过修改脚本来检索电子邮件的电子邮件地址和电子邮件标题。

既然如此,下面的修改如何?

修改后的脚本:

请在高级 Google 服务中启用 Gmail API。

function doPost(e) {
  const message = JSON.parse(e.postData.contents).message;
  const data = JSON.parse(Utilities.newBlob(Utilities.base64Decode(message.data)).getDataAsString());
  const { historyId } = data;
  const { history } = Gmail.Users.History.list("me", { startHistoryId: historyId });
  if (history.length > 0) {
    const messageId = history[0].messages[0].id;
    const msg = GmailApp.getMessageById(messageId);
    const ss = SpreadsheetApp.openById("MYSHEET").getSheetByName("Borghers Emails");
    ss.appendRow([new Date(), messageId, msg.getFrom(), msg.getSubject()]);
  }
  return ContentService.createTextOutput("ok");
}
  • 在此修改后的脚本中,当收到电子邮件时,doPost使用来自 pub/sub 的事件对象运行。并且,从事件对象中检索历史ID。然后,从最新的历史ID中检索消息ID。检索消息 ID、发件人和消息标题,并将这些值附加到“Borghers Emails”表中。

  • 在这种情况下,message.message_id您脚本中的消息 ID 与电子邮件的消息 ID 不同。这是发布/订阅消息 ID。请注意这一点。

Note:

  • 当您修改Web Apps的Google Apps脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映在Web Apps中。请注意这一点。

  • 您可以在我的报告中看到详细信息“在不更改新 IDE 的 Web 应用程序 URL 的情况下重新部署 Web 应用程序(作者:我) https://gist.github.com/tanaikech/ebf92d8f427d02d53989d6c3464a9c43".

参考:

  • 方法:users.history.list https://developers.google.com/gmail/api/reference/rest/v1/users.history/list
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

收到电子邮件时电子表格自动更新(发布/订阅)但信息错误[关闭] 的相关文章

  • 从 Google Cloud Bigtable 导出数据时出错

    在经历谷歌文档 https cloud google com bigtable docs exporting importing export bigtable 我在最终导出命令上得到以下堆栈跟踪 从具有适当环境变量设置的主实例执行 HAD
  • 如何将 Google Cloud Storage 中的许多文件设为私有?

    我进行了很多研究 但无法为此提出解决方案 以下是我用来在 GCP 中公开所有文件的代码 def make blob public bucket name blob name Makes a blob publicly accessible
  • 尝试使用 REST API 公开对象时出现“访问被拒绝。提供的范围未经授权”错误

    我正在尝试对 Google Cloud Storage 存储桶中的各个对象设置权限 以使它们可公开查看 如下Google 文档中指示的步骤 https cloud google com storage docs access control
  • 使用java将文件从GCS存储桶传输到SFTP服务器

    我能够从 GCS 存储桶读取文件 但所有库都喜欢jsch将文件传输到 SFTP 服务器时会查找文件路径 而不是内存中的文件 我不想将从GCS读取的文件写入磁盘 如何将内存中的文件传输到SFTP 我假设您想上传内存中的数据 JSch 实际上有
  • GCE Windows 启动脚本

    我面临一个奇怪的问题 我的windows startup script ps1没有在启动时运行官方链接 https cloud google com compute docs startupscript providing a startu
  • 将 PyPI 包添加到 Composer 环境时出现错误

    我刚刚创建了一个新的 Cloud Composer 环境 在尝试向该环境添加一些 PyPI 包时遇到错误 例如google cloud pubsub This is the data about the environment 我尝试添加时
  • 无法在 onclick 函数中传递多个参数

    我正在尝试创建一个上传机制 其中我可以使用 HTML 中的文件 ID 将文件上传到 google 驱动器中 我不想将文件夹的 ID 放在上传函数中 因为这是需要的 我试图通过声明另一个参数 即函数 upload e id 来传递函数 upl
  • 如何添加“字符串数组”作为 BigQuery 的架构值

    我想将字符串值数组存储在 BigQuery 中的单个列中 为此 我需要首先创建一个具有正确架构的表 该数组的模式标识符是ARRAY
  • 如何从 Google 电子表格中删除项目?

    我通过在脚本编辑器上选择 文件 gt 制作副本 错误地制作了 Google Apps 脚本项目的副本 从那时起 每次我在该项目所属的电子表格屏幕上单击 工具 gt 脚本编辑器 时 我看到显示两个项目 原始项目和复制项目 的屏幕 我需要选择一
  • 如何下载以前保存的 Google Apps 脚本修订版本?

    我仍在尝试从中恢复不知何故 丢失 了 Google Apps 脚本 https stackoverflow com questions 33697789 当我创建脚本的副本以将代码分叉到另一个项目时 我的想法是尝试通过驱动器 API 下载
  • 如何使 onEdit() 触发函数应用于多个工作表

    我正在处理一张 Google 表格 我有一个脚本可以填充column B当我更新时有时间戳column A在第一个选项卡上 不过 我需要它在第二个选项卡上执行相同的操作 但我无法让它在那里工作 我需要改变什么 我当前使用的脚本是 funct
  • Firebase blaze 计划是否有 Spark 计划配额?

    Firebase Blaze 计划是否有 Spark 计划免费配额 我想将 Firebase 与 google 云平台一起使用 但仍希望有免费托管限制 我不关心其他服务 因为我不使用它们 更新 2018 03 13 Blaze 计划中的项目
  • GCP - 获取有关存储桶的完整信息

    我需要获取存储在Google Bucket中的文件信息 信息如文件大小 存储类别 上次修改时间 类型 我搜索了谷歌文档 但它可以通过curl或控制台方法来完成 我需要从 Python API 获取该信息 例如下载 blob 将 blob 上
  • 列出文件夹中的所有文件,包括子文件夹中的文件

    我正在尝试创建一个 Google Apps 脚本 该脚本将允许用户获取文件夹内的所有文件 包括连接到主文件夹的子文件夹内的文件 请注意 在我的代码中 我是提供folderid的人 这将是主文件夹 我已设法从文件夹中获取所有文件 但我还希望提
  • 如何使用 google Sheet 作为数据库

    如何在 HTML Web 应用程序中生成 Google 工作表数据 并允许用户从 HTML Web 应用程序更新评论 我在谷歌表中有一些数据 通过谷歌表单提交 我想使用搜索按钮根据 请求编号 从网络应用程序搜索工作表数据 应该能够更新网络应
  • Google Cloud Platform App Engine 节点灵活实例 Ruby RAM 使用率为 50%

    有一个 ruby 进程始终处于 50 RAM 利用率 无论实例分配了多少 RAM 我在弹性环境中运行 Node 并使用一个简单的 Express 应用程序 该应用程序通过 Sequelize 连接到 Cloud SQL 实例 我尝试将 RA
  • 自动从外部数据库加载 Google 电子表格数据

    我有一个共享的 Google 电子表格 工作表的某些列必须填充数据库服务器 PostgreSQL 中存在的数据 SQL 查询 此外 数据加载必须安排为自动完成 例如每天 1 点 最后 我需要在电子表格中进行一些调整 例如 加载后将日期时间放
  • 通过 Google Apps 脚本发送电子邮件时出现问题

    我有时已经成功地通过 Google Apps 脚本发送电子邮件 但是 当我打开一个新的 Google Workspace 帐户并使用相同的代码将相同的内容发送到同一个接收者时 新帐户不起作用 我收到一条 消息已被阻止 的消息 电子邮件受保护
  • Firestore 中的多租户

    关于基于子集合值查询数据的实际限制 在 Firestore 中管理多租户的建议方法是什么 我希望能够检索和限制对与用户所属实体 公司相关的数据的访问 数据结构示例 companies companyId users companies co
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该

随机推荐

  • iPhone 自动对焦中到“兴趣点”的距离

    在iphone中 我想计算相机到拍摄对象的距离 我想知道也许 iPhone 相机的 主动自动对焦 为我提供了到拍摄对象 兴趣点 的距离 提前谢谢了 附注伙计们 如果您认为不可能 请告诉我 据我所知 这是不可能的 请参阅here http d
  • Pyside6:从 QTableWidget 复制粘贴、删除、撤消多个单元格

    我希望能够使用 control C control V 在 Pyside6 表 QTableWidget 之间进行复制和粘贴 主要是在 Excel 之间进行复制和粘贴 我找到了 Momo 2023 年 1 月的帖子 1 https stac
  • JavaScript 闭包。在循环中访问当前 i、j 变量[重复]

    这个问题在这里已经有答案了 我尝试动态生成 table 使用 jQuery 我想为每个单元格设置单击处理程序 因此当单元格单击时 弹出窗口将显示单元格的当前索引 我如何访问 CURRENTi and j循环中的变量 for var i 0
  • 如何使用不同的服务帐户凭据验证谷歌API?

    任何曾经不幸以编程方式与 Google CLI 二进制文件进行交互的人都会意识到 可以使用以下工具进行身份验证gcloud gsutil bq等远非直观或琐碎 尤其当您需要跨不同项目工作时 我正在为不同的项目运行与 Google Cloud
  • 在 Ubuntu Linux 上安装功能齐全的 PostGIS 2.0 GEOS/GDAL 问题

    我一直致力于在 ubuntu maverick amd64 Linux 服务器上启动并运行 postgis 2 0 大约一周 我正在寻求栅格和拓扑支持 我使用以下内容进行配置 sudo configure with raster with
  • JAXB RI ClassFactory 中的空指针异常

    Intro 我和我的朋友正在开发一个 JavaFX 应用程序 该应用程序充当我们学校的规划器 我们有任务 课程作业 活动 课程和学生信息 为了将数据持久存储在用户的硬盘上 我们使用了 JAXB 我们已经注释了我们的类 并且可以成功地将 Ta
  • 使用 Flexbox 具有相同高度元素的多行网格

    我正在尝试创建一个具有多行和多列的网格 我希望使用 Flexbox 使它们都具有相同的高度 但我唯一能得到的是一行上具有相同大小的列 这是我正在尝试做的事情的一个例子 http jsbin com maxavahesa 1 edit htm
  • 如何在 OSX 上替换 Python 中的“关于 Tkinter”菜单

    编辑 我指的是 OSX 应用程序菜单 其中包含 关于 和 首选项 菜单项 以及其他菜单项 对于知道正确搜索词的人来说 也许这将是另一个简单的过程 但是在花费数小时在 IDLE 中跟踪代码并搜索网络之后 我还没有完全能够将这些点联系起来 我正
  • 以编程方式从 DataTable 创建 DataGridview

    我有以下代码 DataTable table new DataTable DataTable is filled with values here DataGridView grid new DataGridView foreach Dat
  • Javascript charAt() 打破多字节字符串

    此代码在 Nodejs v0 10 21 中崩溃 usr bin env node use strict var urlEncoded http zh wikipedia org wiki F0 A8 A8 8F var urlDecode
  • Python请求,如何将内容类型添加到multipart/form-data请求

    我使用 python requests 通过 PUT 方法上传文件 远程 API 仅当正文包含属性时才接受任何请求 Content Type i mage png 不作为请求标头 当我使用 python requests 时 请求因缺少属性
  • 迭代器性能

    与直接使用指针相比 实现和使用迭代器是否会带来任何类型的性能损失 假设我们使用最高的编译器优化 代码来自http www cplusplus com reference iterator iterator http www cplusplu
  • 迭代器实现应该如何处理检查异常?

    我将 java sql RecordSet 包装在 java util Iterator 中 我的问题是 如果任何记录集方法抛出 SQLException 我该怎么办 The java util Iterator javadoc http
  • 如何在eclipse中运行maven项目

    我有一个带有 TestNG 的 Java Maven 项目 我想从 eclipse 运行它 我使用 Eclipse Kepler 并安装了 m2eclipse 插件 但是菜单 Run as 中没有任何与 maven 连接的选项 有人可以帮我
  • 当我单击“确定”按钮时,Android AlertDialog 总是退出

    有没有办法在单击 确定 后进行验证 我没有忽略它 但当我单击 确定 时它会关闭 我编写了一个使用一些编辑文本的自定义 AlertDialog 问题是我无法验证任何内容 如果验证失败 我想更改消息并告诉用户 但它只是关闭 我正在使用Alert
  • Blazor 服务器应用程序中的 HttpContext.Session

    我正在尝试使用HttpContext Session在我的 ASP NET Core Blazor Server 应用程序中 如此处所述MS Doc https learn microsoft com en us aspnet core f
  • TCPDF:将文本剪切到单元格宽度

    我正在广泛使用 TCPDF 的 Cell 方法生成 PDF 报告 使用 Cell 方法打印的文本超出了方法中指定的宽度 我只想打印适合指定宽度的文本部分 但不要溢出或换行到下一行 我不想要字体拉伸策略 我搜索了很多但找不到解决方案 还有其他
  • 如何优雅地为具有多态关联的模型构建表单?

    这是我的模型 class Lesson lt ActiveRecord Base belongs to topic polymorphic gt true validates presence of topic type topic id
  • 如何检测三角形区域的触摸

    对于我的应用程序 我需要将 iPhone 的屏幕对角线分成 4 个部分 并检测哪个部分被触摸 我很困惑 因为我的区域是三角形而不是正方形 我找不到解决方案来检测哪个三角形被触摸 我用 TouchBegan 方法得到了被触摸的点 然后我被卡住
  • 收到电子邮件时电子表格自动更新(发布/订阅)但信息错误[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在 Google Cloud Platform 上设置了第一个 Pub Sub 它使用 Gmail API 在每次收到电子邮件时更新