首页 > 解决方案 > 如何使用显示草稿并将电子邮件发送到容器绑定项目的库?

问题描述

我有 2 个 Google Apps 脚本项目

  1. SheetsLib - 这是我创建的一个库,它包含我的首选功能。
  2. TestFile - 这是一个容器绑定脚本,它利用 SheetsLib。

SheetsLib 包含以下与此问题相关的函数:

  1. displayDraftsSelector - 在侧边栏中显示 DraftSelector Html 页面。
  2. DraftSelector - Html 文件,其中包含一个 js 脚本以及调用后端函数来填充<select>
  3. getDraftsArr - 返回用户所有 gmail 草稿的服务器函数。

SheetsLib 函数确实有效,即我有测试函数来确认这一点。我的目标是增强这个库,以便我可以在多个项目中使用它,并允许用户选择现有的 Gmail 草稿并将其发送给选定的用户(在活动的电子表格中)。

问题 在可以访问库的新容器绑定脚本中,当我按下侧边栏中的按钮时,我只能显示侧边栏但不能调用后端函数(位于库中):

  1. displayDraftsSelector()我使用显示视图成功加载视图draftSelector。这是图书馆的所有功能。
  2. 然后,视图调用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>

标签: google-apps-scriptgoogle-sheets

解决方案


如果您可以创建一个虚拟函数。然后要创建的虚拟函数是这个:

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
}

推荐阅读