小编Emp*_*yee的帖子

使用Gmail API发送的邮件中缺少附件,但仅适用于收件人

在Javascript中使用Gmail API发送带有HTML正文和~100KB PDF附件的邮件时,附件会正确显示在发件人的Gmail已发送文件夹中的邮件中,但不会显示在收件人的邮件中.

API调用是POST:

https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=media
Run Code Online (Sandbox Code Playgroud)

发送给API的请求正文是:

{
  "headers": {
    "Authorization": "Bearer authToken-removedForThisPost"
  },
  "method": "POST",
  "contentType": "message/rfc822",
  "contentLength": 134044,
  "payload": "exampleBelow",
  "muteHttpExceptions": true
}
Run Code Online (Sandbox Code Playgroud)

这是有效载荷的样子:

MIME-Version: 1.0
To: =?utf-8?B?TWlrZSBD?=<recipient@test.com>
CC: =?utf-8?B?TWlrZSBD?=<secondrecipient@gmail.com>
BCC: =?utf-8?B??=<bccrecipient@test.com>
From: =?utf-8?B?TWlrZSBxWXsd2lr?=<sender@test.com>
Subject: =?utf-8?B?subjectLine-removedForThisPost?=
Content-Type: multipart/alternative; boundary=__boundary__

--__boundary__
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

base64EncodedStringHere-removedForThisPost

--__boundary__
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

base64EncodedStringHere-removedForThisPost

--__boundary__
Content-Type: application/pdf; name="File Name.pdf"
Content-Disposition: attachment; filename="File Name.pdf"
Content-Transfer-Encoding: base64

base64EncodedStringHere-removedForThisPost

--__boundary__--
Run Code Online (Sandbox Code Playgroud)

注意:Gmail API上传附件文档指出,上传简单附件(5MB以下)时Content-Length需要.我做了它,以便我的代码生成PDF附件的总字节数的整数值.但是,我注意到它Content-Length没有包含在有效载荷中.

我尝试将multipart/alternative邮件的内容类型更改为 …

email gmail attachment email-attachments gmail-api

13
推荐指数
1
解决办法
1582
查看次数

Google Apps脚本格式日期使用用户的时区而非GMT

我有一行设置单元格中的当前日期和时间:

sheet.getRange(1,1).setValue(new Date());
Run Code Online (Sandbox Code Playgroud)

然后我有一行根据该单元格的值创建格式化日期:

var addedDate = sheet.getRange(1,1).getValue();
var addedTime = Utilities.formatDate(addedDate, "GMT", "hh:mm a");
Run Code Online (Sandbox Code Playgroud)

结果addTime似乎在GMT时区,我需要它在用户的时区.它通常是美国东部时间(-0500),但如果我只是从那个时间减去5个小时,那么不考虑夏令时(-0400).

我在这里查看了formatDate的文档:https://developers.google.com/apps-script/reference/utilities/utilities#formatDate (Date,String,String )

这里链接到官方的Java SimpleDateFormat类文档:http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

...但我无法在那里找到有效时区列表来替换GMT.

javascript time timezone google-apps-script timezone-offset

12
推荐指数
1
解决办法
3万
查看次数

创建 AWS 路由表以使子网可公开访问时 Terraform“不支持路由目标”

使用 terraform v0.12.21 和 AWS provider v2.51.0,我试图从头开始创建一些基础设施(没有以前的 terraform 状态)。

目标是在单个 VPC 中拥有一些可公开访问的 EC2 实例,我认为这些是我需要完成的资源:

  • 专有网络
  • VPC中的互联网网关
  • VPC 中的子网
  • VPC 中用于将子网连接到 Internet 网关的路由表
  • 将子网连接到路由表的路由表关联
  • VPC中的一个安全组,将为实例设置
  • 多个 EC2 实例

使用这个 terraform 配置:

locals {
  office_cidr = ["x.x.x.x/32", "x.x.x.x/32"]
}

provider "aws" {
  region  = var.region
  version = "~> 2.51"
}

resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
}

resource "aws_internet_gateway" "gw" {
  vpc_id = aws_vpc.main.id
}

resource "aws_subnet" "main" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

resource "aws_route_table" …
Run Code Online (Sandbox Code Playgroud)

routing amazon-ec2 vpc terraform terraform-provider-aws

8
推荐指数
1
解决办法
3127
查看次数

Google Apps脚本使用replaceText()使文本成为可点击的URL

我有这个代码打开文件并使用replaceText替换字符串.

var url = 'http://www.test.com';
var doc = DocumentApp.openById(file.getId());
doc.replaceText("<<urlGoesHere>>", url);
doc.saveAndClose();
Run Code Online (Sandbox Code Playgroud)

当我打开文档时,替换已经发生,但是url不是可点击的超链接,它只是静态文本.有没有办法以编程方式使其成为可点击的链接?

我发现这种文本方法叫做setLinkUrl,但是没有文档/示例:https://developers.google.com/apps-script/reference/document/text#setLinkUrl(String )

有任何想法吗?

url text replace hyperlink google-apps-script

6
推荐指数
1
解决办法
5936
查看次数

用于获取Google Apps域中最大数量许可的Google API

我有一个Google Apps脚本功能,用于在我们的Google Apps域中为新员工设置帐户.

它做的第一件事是调用Google Admin Settings API并检索currentNumberOfUsersmaximumNumberOfUsers,这样它就可以看到是否有可用的席位(否则使用Admin SDK Directory API创建用户的后续步骤将失败).

直到最近,当我们的域名必须从Postini迁移到Google Vault进行电子邮件归档时,它才能正常运行.

迁移之前,使用管理SDK目录API创建Google Apps用户时,它会将 currentNumberOfUsers增加1,新用户帐户用户将自动访问所有Google Apps服务.

现在迁移后,在创建Google Apps用户时,他们不会自动分配"许可证",因此我修改了我的脚本以使用 Enterprise License Manager API,现在它分配了"Google-Apps-For-Business"许可证.这很好.

但是,currentNumberOfUsers现在与分配的许可证数量不同,并且"Google-Apps-For-Business"只是可用的几种不同类型许可证中的一种.

我可以通过运行以下命令获取当前分配的 "Google-Apps-For-Business"许可证数量:

var currentXml = AdminLicenseManager.LicenseAssignments.listForProductAndSku('Google-Apps', 'Google-Apps-For-Business', 'domain.com', {maxResults: 1000});
    
var current = currentXml.items.toString().match(/\/sku\/Google-Apps-For-Business\/user\//g).length;
Run Code Online (Sandbox Code Playgroud)

但产生的数字与currentNumberOfUsers不同.

我现在真正需要做的就是获得最大数量的拥有"Google-Apps-For-Business"许可证,以便新员工设置脚本可以确定是否有可用的许可证.

我查看了以下API的API参考文档,但是......

Enterprise License Manager API →没有获取最大或可用许可证数量的方法.

Google管理员设置API …

api google-api google-apps google-apps-script

6
推荐指数
1
解决办法
1268
查看次数

通过API作为Google Apps超级管理员关闭用户的两步验证

作为员工离开公司的"离职"流程的一部分,作为超级管理员,我们使用Google Apps管理员SDK目录API更改用户密码,以便他们无法再访问其帐户.然后我们登录进行Google导出,重置其他帐户的密码等.

但是,我们最近决定对所有用户实施两步验证.所以现在当我们登录他们的帐户时,它会向他们的手机发送一个代码.

由于SubOrg强制执行2步,因此我们甚至无法通过管理控制台将其关闭.所以我现在所能做的就是让API将用户移动到其中关闭2步强制设置的不同SubOrg,然后手动关闭2步.

有没有办法以编程方式关闭帐户的两步验证?

我查看了Google Apps管理SDK目录API用户:更新文档,但它似乎与2步没有任何关系.

报告API可以找出用户的注册状态,但它的只读的报告目的.

authentication google-api google-apps google-apps-script

6
推荐指数
1
解决办法
3030
查看次数

更新 Google Apps 脚本侧边栏中的内容而不重新加载侧边栏

我使用以下 Google Apps 脚本代码在脚本运行时在电子表格的自定义侧边栏中显示内容:

function test() {

  var sidebarContent = '1<br>';

  updateSidebar(sidebarContent);

  sidebarContent += '2<br>';

  updateSidebar(sidebarContent);

  sidebarContent += '3';

  updateSidebar(sidebarContent);

}

function updateSidebar(content) {

  var html = HtmlService.createHtmlOutput(content)
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setTitle('Sidebar')
      .setWidth(250);

  SpreadsheetApp.getUi().showSidebar(html);

}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是每次该updateSidebar()函数运行时,侧边栏都会在加载新内容时闪烁。

我该如何编程才能更有效地更新侧边栏的内容,从而消除闪烁?

我假设SpreadsheetApp.getUi().showSidebar(html);实际上应该只在开始时运行一次,并且内容的后续更新应该由 .js 文件中的 Javascript 处理。

但我不知道如何sidebarContent从用户浏览器中运行客户端的 JavaScript 代码获取变量。

另外,我知道这一定是可能的,因为我今天刚刚在 Google Apps 开发者博客上看到这篇关于使用自定义侧边栏的应用程序的帖子,并且文章末尾的 .gif 显示了一个正在更新的动画精美的侧边栏实时。

javascript google-apps-script

5
推荐指数
1
解决办法
4297
查看次数

使用 Trello API 在卡片上设置自定义字段值

我正在尝试使用Trello API的新自定义字段方法来设置卡片上自定义字段的值。

我创建了一个类型为 的自定义字段number。当我GET通过 it's 发出自定义字段请求时id,它返回此自定义字段对象:

{
"id":"5ab13cdb8acaabe576xxxxx",
"idModel":"54ccee71855b401132xxxxx",
"modelType":"board",
"fieldGroup":"837a643fd25acc835affc227xxxxxxxxxxxxxxxxxxxx",
"name":"Test Number Field",
"pos":16384,
"type":"number"
}
Run Code Online (Sandbox Code Playgroud)

然后,当我在 Trello UI 中创建一张新卡(但不要在框中输入值Test Number Field),然后GET使用该卡customFieldItems=true(如此处所述时,它会返回此卡对象(删除了不相关的字段):

{
"id": "5ab56e6b62abac194d9xxxxx",
"name": "test1",
"customFieldItems": []
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于我没有Test Number Field在 UI 的框中输入任何内容,因此该customFieldItems属性包含一个空数组。

然后,如果我再次在 UI 和卡的框中输入数字,它会返回以下内容(删除了不相关的字段1):Test Number FieldGET

{
"id": "5ab56e6b62abac194d9xxxxx",
"name": "test1",
"customFieldItems":
    [
        {
        "id": "5ab570c5b43ed17b2dxxxxx",
        "value": {
            "number": "1"
            }, …
Run Code Online (Sandbox Code Playgroud)

api object trello trello-powerup

5
推荐指数
1
解决办法
3426
查看次数

通过覆盖“检测到 CI,跳过 Git hooks 安装”在 Jenkins 管道作业中安装 husky git hooks

我正在尝试使用husky安装 git hooks 作为 Jenkins 管道作业的一部分。

我已将其添加到 Jenkins 作业中:

npm install husky --save-dev
Run Code Online (Sandbox Code Playgroud)

但是当作业运行时,我在 Jenkins 输出中看到了这一点:

> node-sass@4.14.1 install /home/jenkins/agent/workspace/<branch_name>/node_modules/node-sass
> node scripts/install.js

Downloading binary from https://github.com/sass/node-sass/releases/download/v4.14.1/linux_musl-x64-72_binding.node
Download complete
Binary saved to /home/jenkins/agent/workspace/<branch_name>/node_modules/node-sass/vendor/linux_musl-x64-72/binding.node
Caching binary to /root/.npm/node-sass/4.14.1/linux_musl-x64-72_binding.node

> husky@4.3.0 install /home/jenkins/agent/workspace/<branch_name>/node_modules/husky
> node husky install

husky > Setting up git hooks
CI detected, skipping Git hooks installation.
husky > Done
Run Code Online (Sandbox Code Playgroud)

...并且.git/hooks/precommit钩子文件永远不会创建。

故障排除研究笔记:

  • husky v4 文档中,它说“默认情况下,Husky 不会安装在 CI 服务器上”。我找不到任何有关如何覆盖该默认行为的文档。

  • 在搜索 repo 代码时,我什至无法在代码中 …

git continuous-integration pre-commit-hook jenkins husky

5
推荐指数
1
解决办法
3898
查看次数

在 Google Apps 脚本中使用 Admin SDK Directory API 创建群组在“表单提交时”不起作用

我已经阅读了 Admin ADK Directory API 文档中的所有相关页面以及 stackoverflow 上的几个问题,但我仍然陷入困境。

我是我的 Google Apps 域的超级管理员,我希望我的域中的用户能够创建自己的 Google 网上论坛。我制作了一个 Google 表单,用户可以在其中指定群组的名称和电子邮件。然后,Google 表单响应表有一个“表单提交时”触发器,它调用我的代码来创建组。

createGroupTest()当我从脚本编辑器运行时,此代码有效。它会立即在我的 Google Apps 域中创建该组。

当“表单提交”触发器运行该函数时,此代码不起作用onFormSubmit(e)catch(e)我收到了来自俗语的电子邮件Exception: Failed to authenticate for service: Groups

有谁知道是什么导致 oauth 身份验证在脚本编辑器中工作,但在 onFormSubmit 函数调用时却不起作用?

function onFormSubmitTest() {
 
  var t = new Date();
  t = t.getTime();
  
  onFormSubmit([t, "AAA Test Group " + t], ["aaa.testgroup." + t + "@mydomain.com"], ["me@mydomain.com"]);
  
}

var consumerKey = "mydomain.com";
var consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxx";
var domainName = "mydomain.com";

function …
Run Code Online (Sandbox Code Playgroud)

google-apps google-apps-script oauth-2.0 google-admin-sdk google-directory-api

4
推荐指数
1
解决办法
2267
查看次数