google-apps-script - 如何使用显示草稿并将电子邮件发送到容器绑定项目的库?
问题描述
我有 2 个 Google Apps 脚本项目。
- SheetsLib - 这是我创建的一个库,它包含我的首选功能。
- TestFile - 这是一个容器绑定脚本,它利用 SheetsLib。
SheetsLib 包含以下与此问题相关的函数:
- displayDraftsSelector - 在侧边栏中显示 DraftSelector Html 页面。
- DraftSelector - Html 文件,其中包含一个 js 脚本以及调用后端函数来填充
<select>
- getDraftsArr - 返回用户所有 gmail 草稿的服务器函数。
SheetsLib 函数确实有效,即我有测试函数来确认这一点。我的目标是增强这个库,以便我可以在多个项目中使用它,并允许用户选择现有的 Gmail 草稿并将其发送给选定的用户(在活动的电子表格中)。
问题 在可以访问库的新容器绑定脚本中,当我按下侧边栏中的按钮时,我只能显示侧边栏但不能调用后端函数(位于库中):
displayDraftsSelector()
我使用显示视图成功加载视图draftSelector
。这是图书馆的所有功能。- 然后,视图调用
getDraftsArr()
,这就是得到错误的原因。但是该功能确实存在于库中(并且确实按预期工作)。
以下是边栏加载时我在控制台中看到的错误:
未捕获的类型错误:google.script.run.withSuccessHandler(...).withFailureHandler(...).getDraftsArr 不是函数
理想情况下应该发生的是,调用后端函数getDraftsArr()
并将其结果填充到选择项中。然后用户可以在侧边栏中选择一个草稿。当用户使用按钮确认时,活动行是收件人。总的来说,当我复制->粘贴时,这一切都有效,但无法弄清楚如何将功能保留在库中。
以下是我试图调用的位于库中的函数。
// back-end in Library Project
function getDraftsArr(){
let output = [];
const messages = GmailApp.getDraftMessages();
messages.forEach( message => {
output.push({
id: message.getId(),
subject: message.getSubject()
});
});
return JSON.stringify(output)
}
以下是在库的后端
// front-end in Library Project
<select id="draftsSelect"></select>
<script>
function getDrafts(){
const draftsSelect = document.getElementById("draftsSelect");
google.script.run
.withSuccessHandler( updateDrafts )
.getDraftsArr();
function updateDrafts( drafts ){
var options = "";
var draftsParsed = JSON.parse(drafts);
draftsParsed.forEach( draft => {
options += "<option value='" + draft.id + "'>" + draft.subject + "</option>";
});
draftsSelect.innerHTML = options; }
}
</script>
解决方案
如果您可以创建一个虚拟函数。然后要创建的虚拟函数是这个:
function executeLibraryFunctionsByName(funcname) {
libraryname[funcname]();
}
此函数将允许您按名称调用所有库函数。如果您的库名称中有空格,我不确定这是否有效。在这种情况下,更改它的名称。注意:不要在 libraryname 周围加上引号。只需编写不带引号的库名,我会避免使用空格,它会成为您函数的“this”。
例如,我有一个库 xyzSUS1,我可以使用这样的按钮:
<input type="button" value="test" onClick="google.script.run.callLibraryFunctionsByName('selectColumnsSkipHeader');" />
在我的侧边栏中运行库函数 xyzSUS1.selectColumnsSkipHeader() 。
我的 gs 代码中函数声明中的命令是这样的:
function callLibraryFunctionsByName(funcname) {
xyzSUS1[funcname]();//the this for funcname because xyzSUS1
}
推荐阅读
- python - 将 sagemaker 中的 pandas 数据帧写入 AWS S3 文件
- android - androidTest 未在 Android API 低于 21 的模拟器上运行
- xml - 使用带有文本文件的 awk 命令创建 XML
- php - 如何根据选中的复选框提交多个数组?
- javascript - 仅显示该日期的信息
- r - 这个混合效应模型的最佳“公式”是什么
- python-3.x - 在 Strava API v3 中获取所有运动员活动的问题
- javascript - 转换对象的json数组
- java - 如何更改按下按钮时 recyclerView 项目的颜色?
- python - 如何自动将数据推送到我的网站并相应地重新呈现?