【问题标题】:Send Email when value changes in Google Spreadsheet当 Google 电子表格中的值发生变化时发送电子邮件
【发布时间】:2014-03-13 07:24:55
【问题描述】:

我想弄清楚,如何在 Google 电子表格中执行以下操作。

  1. 当单元格中的值更改时发送电子邮件。 (价值 = 已完成)。
  2. 将该行数据编译到电子邮件中。请参阅下面代码中的格式。
  3. 提示用户确认信息。
  4. 如果是,则向活动用户以及下面代码中的预设用户发送电子邮件。
  5. 这是可选的: 使用已发送电子邮件 + 时间戳更新第 (P) 列 (P) 16 行中的工作表。

嗨,谢尔盖,

尝试实现您提供的代码,但我无法确定要修改的内容以适应我需要做的事情。

让我用下面的工作流程再次解释一下。

当 K 列的值发生变化时发送电子邮件。

观看K栏的部分示例代码

var sheetNameToWatch = "Active Discs";
var columnNumberToWatch = 14; // column A = 1, B = 2, etc.
var valueToWatch1 = "Completed";
var valueToWatch2 = "in progress";

try{
var ss = e.source;
var sheet = ss.getActiveSheet();
var range = e.range;

if (sheet.getName() == sheetNameToWatch && range.columnStart == 
columnNumberToWatch && e.value == valueToWatch)

var confirm = Browser.msgBox
('Email will be sent Team X. Do you want to sent this email?', Browser.Buttons.YES_NO); 
if(confirm!='yes'){return};
// if user click NO then exit the function, else move data

电子邮件将包含该特定行的指定值。前任。 A、B、C、D、E、F、G、H、I、J 列中的值。

//Email to be sent if **Inprogess** value is a match:

Var sendEmailTeamA(){

var ProjectName = e.values[0];
var ProjectId = e.values[1];
var ProjectManager = e.values[3];
var Sales = e.values[4];
var Client = e.values[5];
var DiscType = e.values[6];
var DVDFlash = e.values[7];
var Phase = e.values[8];
var Encryption = e.values[9];
var Qty = e.values[11];
var DueDate = e.values[12];
var SpecialInstructions = e.values[13];
var emailAddress = '';
var subject = "DVD Request - " + ProjectName + " " + ProjectId;
var emailBody = "Hi Venue Colombo Team,"
  "\n\nThe following data room(s) will need a disc creation. Please begin bulk save data room and create ISO to upload to the FTP site: " +
  "\nProject Name: " + ProjectName +
  "\nProject ID: " + ProjectId +
  "\nProject Manager: " + ProjectManager +
  "\nPhase: " + Phase +
  "\nDisc Type: " + DiscType +
  "\nEncryption: " + Encryption +
  "\nQuantity: " + Qty +
  "\nClient Due Date: " + DueDate +
  "\nSpecialInstructions: " + SpecialInstructions;
var htmlBody = "Thank you for your <b>Club Ambassador Program</b> report submitted on <i>" + timestamp +
  "</i><br/>&nbsp;<br/>Person Show Submitted this email: " +
  "<br/><font color=\"red\">Your Name:</font> " + activeSessionuser +
  "<br/>Your Email: " + toAddress;
var optAdvancedArgs = {name: "Club Ambassador Program", htmlBody: htmlBody};
MailApp.sendEmail(emailAddress, subject, emailBody, optAdvancedArgs);
}

//Email to be sent if **“Completed”** value is a match:

Var sendEmailTeamB() {

var ProjectName = e.values[0];
var ProjectId = e.values[1];
var ProjectManager = e.values[3];
var Sales = e.values[4];
var Client = e.values[5];
var DiscType = e.values[6];
var DVDFlash = e.values[7];
var Phase = e.values[8];
var Encryption = e.values[9];
var Qty = e.values[11];
var DueDate = e.values[12];
var SpecialInstructions = e.values[13];
var emailAddress = '';
var subject = "DVD Request - " + ProjectName + " " + ProjectId;
var emailBody = "Hi Venue Colombo Team,"
  "\n\nThe following data room(s) will need a disc creation. Please begin bulk save data room and create ISO to upload to the FTP site: " +
  "\nProject Name: " + ProjectName +
  "\nProject ID: " + ProjectId +
  "\nProject Manager: " + ProjectManager +
  "\nPhase: " + Phase +
  "\nDisc Type: " + DiscType +
  "\nEncryption: " + Encryption +
  "\nQuantity: " + Qty +
  "\nClient Due Date: " + DueDate +
  "\nSpecialInstructions: " + SpecialInstructions;
var htmlBody = "Thank you for your <b>Club Ambassador Program</b> report submitted on <i>" + timestamp +
  "</i><br/>&nbsp;<br/>Person Show Submitted this email: " +
  "<br/><font color=\"red\">Your Name:</font> " + activeSessionuser +
  "<br/>Your Email: " + toAddress;
var optAdvancedArgs = {name: "Club Ambassador Program", htmlBody: htmlBody};
MailApp.sendEmail(emailAddress, subject, emailBody, optAdvancedArgs);
}

此工作流程将适用于 K、L、M、N、O 列。电子邮件将发送到代码中预设的电子邮件地址。我希望这能更好地解释它。再次感谢您的时间和帮助。

【问题讨论】:

  • 我很想给你一个完整的代码,但是从头开始创建一个包含所有必要值的电子表格来测试结果肯定是太多的工作......你可以分享一个 SS我(我们)可以测试代码吗?
  • 这里是实际的测试表。 docs.google.com/spreadsheet/…
  • 我将在周日重新上线与您一起工作。

标签: google-apps-script google-sheets spreadsheet sendmessage


【解决方案1】:

我可以帮你开始:

  1. Resources>Current project's triggers 中添加一个触发器,该触发器在“编辑时”触发 sendEmail()。
  2. ...

【讨论】:

  • 感谢您的建议。我将设置为触发器 onedit 但我需要查看代码是否与我希望它执行的操作正确。
  • 根据developers.google.com/apps-script/guides/triggers/#restrictions,“他们无法访问需要授权的服务。例如,简单的触发器无法发送电子邮件,因为Gmail服务需要授权,但简单的触发器可以翻译带有语言服务,是匿名的。”
  • @AleisterTanekJavasMraz 这是正确的,但您可以做的是创建一个可安装的、预先授权的“编辑时”触发器(并称它为您喜欢的名称,可能不是 onEdit() 以避免混淆)。
【解决方案2】:

我刚刚编写了一个脚本来执行这种操作,但我希望它能够密切关注工作表中的所有变化,但每小时只发送一次消息以避免向我的邮箱发送垃圾邮件。

该脚本有 2 个功能,一个用于收集更改并以文本格式存储它们,另一个用于在过去一小时内发生任何更改时发送电子邮件。

第一个函数称为grabData,必须由onEdit 可安装触发器触发,如下所示:

function grabData(e){
  Logger.log(JSON.stringify(e));
  var cell = e.range.getA1Notation();
  var user = e.user.email;
  var time = Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'dd-MM-yyyy')+' à '+Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'hh:mm');;
  if(user!='email1@email.com'&&cell!='A1'){ 
  var dataUser1 = PropertiesService.getScriptProperties().getProperty('contentUser1');
  if(dataUser1==null){dataUser1=''};
  dataUser1+='\nCellule '+cell+' modifiée le '+time+' par '+user+' (nouvelle valeur = '+e.range.getValue()+')';
  PropertiesService.getScriptProperties().setProperty('contentUser1',dataUser1);
  }
  if(user!='email2@email.com'&&cell!='A1'){
  var dataUser2 = PropertiesService.getScriptProperties().getProperty('contentUser2');
  if(dataUser2==null){dataUser2=''};
  dataUser2+='\nCellule '+cell+' modifiée le '+time+' par '+user+' (nouvelle valeur = '+e.range.getValue()+')';
  PropertiesService.getScriptProperties().setProperty('contentUser2',dataUser2);
}
}

另一个功能有一个计时器触发器,我将它设置为每小时触发一次,但您可以将其更改为最合适的。

function sendReport(){
  var dataUser1 = PropertiesService.getScriptProperties().getProperty('contentUser1');
  var dataUser2 = PropertiesService.getScriptProperties().getProperty('contentUser2');
  if(dataUser1.length>1){
    MailApp.sendEmail('email2@email.com', 'Modification dans le planning FFE', dataUser1);
    PropertiesService.getScriptProperties().setProperty('contentUser1','');
  }
  if(dataUser2.length>1){
    MailApp.sendEmail('email1@email.com', 'Modification dans le planning FFE', dataUser2);
    PropertiesService.getScriptProperties().setProperty('contentUser2','');
  }
}

邮件发送后,存储的数据将被删除。如果没有记录更改,则不会发送邮件。

您还可以注意到,我有 2 个不同的用户和 2 个不同的存储位置,因此每个人都可以看到另一个人所做的事情,而不会被通知自己的修改。

由于这两个功能都使用可安装的触发器,这将在您的帐户上运行,因此请注意,如果您将计时器设置为非常短的时间,请注意不要爆炸您的配额。

【讨论】:

  • 谢谢谢尔盖。我今晚会测试一下。现在离开工作。我会回复我是否有问题或勾选已回答的问题。
  • 嗨,Serge,我刚刚编辑了最初的问题,以便更好地解释我希望实现的目标。
猜你喜欢
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多