google-apps-script - 不允许从自定义函数执行 sendEmail(),但在脚本编辑器中可以

标签 google-apps-script google-sheets google-sheets-custom-function

我一直在尝试找到一种方法,将单行数据发送到我在我的域内使用的“实时/运行”电子表格中的特定电子邮件地址,以跟踪卡车司机及其取货号码。我设法使用工作表中提供的 Google Apps 脚本编辑器拼凑了一小段代码:

function sendEmail()
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var activeRow = sheet.getActiveCell().getRow();
   var cellID = "H" + activeRow;    
   var dataRange = sheet.getRange(activeRow, 1, 1, 6);
   var EMAIL_SENT = "EMAIL_SENT";
   var data = dataRange.getValues();
   Logger.log(data[0][0]);

   var emailAddress = usercellnum@carrier.net;
   var message = data;
   var subject = "CG-PU#";
   var emailSent = sheet.getRange(cellID).getValue();

   if (emailSent != "EMAIL_SENT")
   {
     MailApp.sendEmail(emailAddress, subject, message);
     var cell = sheet.getRange(cellID);
     cell.setValue(EMAIL_SENT);
   }
  }
SpreadsheetApp.flush();  
}

我可以通过任何方式从电子表格中的单元格调用该函数,例如 =sendEmail()它应该只发送来自事件行的信息,然后将该行标记为 EMAIL_SENT所以我不会不小心再做一次。

如果我从脚本编辑器内部运行脚本,并且对电子邮件地址进行硬编码,则该脚本运行完美,但是如果我尝试从电子表格本身运行它,我会收到以下消息:

error: You do not have permission to call sendEmail (line 19, file "CPS_sendEmail.gs").



非常感谢您对此的任何帮助!这将有助于防止我的用户跑回 MS Excel 和 Outlook。
当我让它的这部分工作时,我真的很喜欢它,如果我可以让该功能显示用户可以从中选择的地址列表,或者以其他方式让用户不必记住和输入驱动程序地址和运营商,但我很想让它按预期工作。

该脚本将/应该只允许与我的用户一起在我的 Google 域中运行,并且在我第一次执行它时 - 我确信我已经完成了授权过程,但并不真正理解那部分内容。

他们目前正在使用 MS Excel/Outlook 并将该行复制并粘贴到电子邮件中,他们可以使用他们的联系人从中进行选择。如果我无法获得使用 Google 联系人的功能,我正在考虑创建一张带有查找功能或其他功能的驱动程序表 - 当联系人就在那里时必须保留列表有点痛苦 - 但你做你必须做的事情!

最佳答案

通读 Permissions and Custom Functions .由于自定义函数(从电子表格函数调用的脚本)对电子表格的任何用户开放,因此不允许他们使用任何需要身份验证的服务。这就是为什么你不能从一个发送邮件。

这与授权脚本访问您的服务的过程不同。这确实使错误消息令人困惑,但请放心,这与您调用脚本的方式有关。

不过没问题,因为自定义函数无论如何都是执行此类操作的一种糟糕方式,因为每次电子表格发生更改时都会重新评估该函数,从而发送比您想要的更多的电子邮件。

我建议您为此操作创建一个菜单项。 (如果您创建新的电子表格脚本,请参阅编辑器中提供的示例代码。)工作流程是将光标移动到您要处理的行,然后使用菜单“使它如此”,这将调用您的脚本。

关于google-apps-script - 不允许从自定义函数执行 sendEmail(),但在脚本编辑器中可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19840894/

相关文章:

javascript - 查找包含特定字符串的单元格的位置

在 Google Apps 脚本中调试自定义函数

google-apps-script - "Reference does not exist"执行自定义函数时出错

javascript - Google 脚本以纯文本形式发送电子邮件,而不是 HTML

javascript - 谷歌应用程序脚本 : Sheets: Append data from an input range in Sheet1 to a dataset in Sheet2

google-apps-script - 如何查询 ScriptDb 的部分匹配项?

javascript - 在 Google 表格自定义功能中引发自定义异常和错误消息?

google-apps-script - 如何从 Google 电子表格中删除项目?

google-sheets - 在另一个命名范围内引用命名范围中的特定行

google-apps-script - 勾选复选框触发添加时间戳的功能