在非手动更改/编辑单元格时触发脚本 - 谷歌脚本

Posted

技术标签:

【中文标题】在非手动更改/编辑单元格时触发脚本 - 谷歌脚本【英文标题】:Trigger script on non manual change/edit to cell - google script 【发布时间】:2018-08-30 00:08:54 【问题描述】:

每当特定列中的“No”更改为“Yes”时,我都会使用以下脚本发送电子邮件。

但是,只有在将单元格手动更改为“Yes”并在单元格中键入时,才会发生这种情况。以及基于 on edit UI 触发器的触发器。

但单元格会根据引用另一个工作表的公式进行更新,该工作表从中获取“No”和“Yes”,因此无需手动编辑/更新此工作表中的单元格。

如何在不手动更改单元格的情况下发送电子邮件,仅从“No”更改为“Yes

任何帮助将不胜感激。

function sendNotification(e)
  var s = SpreadsheetApp.getActiveSpreadsheet();
  var ss = s.getSheetByName("Order Details")
  if(e.range.getColumn()==3 && e.value=='Yes')
  var cell = ss.getActiveCell();
  var row = cell.getRow();

  var ordernumber = ss.getRange(row,4).getValue();  //Column D
  var sku = []; sku = ordernumber.toString().split("-")

 var sizewidth = ss.getRange(row,5).getValue();  //Column E
 var sizeheight = ss.getRange(row,6).getValue();  //Column F
 var qty = ss.getRange(row,8).getValue();    //Column H
 var country = ss.getRange(row,10).getValue();  //Column J
 var tube = ss.getRange(row,9).getValue();   //Column I
 var paintingimage = ss.getRange(row,7).getValue();  //Column G
 var orderlink = ('http://testly/Km345TS');



 MailApp.sendEmail(
  to: "xxx@gmail.com",
  subject:  country + " New Order No. " + ordernumber, // note the spaces between the quotes...
  //attachment: [file,blob],
  htmlBody: "Hello XYZ,  <br><br>"+
   "Please find order details below. <br><br>"+
    sku[1] + "<br><br>" +
   "Size - Width: " + sizewidth + " x " + "Height: " + sizeheight + "<br><br>"+
   "Quantity - " + qty + "<br><br>"+
   "- It needs to be tube rolled"+ "<br>" +
   "- Shipment to " + country + "<br>" +
   "- Order image is " + paintingimage + "<br><br>" +
   "Please fill in cost and delivery details at this link " + orderlink + "<br><br>" +
   "The order is for a customer from " + country + "<br><br>" +
   "Thanking you, <br>" +
   "ABC",            
                   )
 
 

更新:解决方案 - 非常感谢 Ron。

function sendNotification2()
  var sSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
  var data = sSheet.getRange(2, 1, sSheet.getLastRow(), sSheet.getLastColumn()).getValues(); //get the values of your table, without the header
  var EMAIL_SENT = 'EMAIL_SENT';

  for (var i = 0; i < data.length; i++) 
    var row = data[i];

    var send = row[16];  //Column Q
    var emailSent = row[17];   //Column R
    var ordernumber = row[4];  //Column E
    var country = row[10];  //Column K
    var orderlink = ('http:/testly/Khghgy');
    var shipaddress = row[18];  //Column S

 if (send == "Yes")
    if (emailSent != EMAIL_SENT)  // Prevents sending duplicates

 MailApp.sendEmail(
   to:  "xx@gmail.com",
  subject:  country + " Ship Order No. " + ordernumber, // note the spaces between the quotes...
  htmlBody: "Hello XYZ,  <br><br>"+

   "Thanking you, <br>" +
   "ABC",            
    )
  sSheet.getRange(i+2, 18).setValue(EMAIL_SENT);
   
  
 
 

【问题讨论】:

我已经运行了一个测试,当单元格的值更新为importRange() 时它也不会触发。我检查了网络并发现this,一些触发器“不会像自动重新计算导入函数和像现在这样的函数那样自动更改时触发。”您可以使用可安装的触发器来检查工作表的变化。 【参考方案1】:

如果您想在编辑更改时触发电子邮件,您可以创建一个单独的函数来监视另一张表上的编辑,然后调用上述函数发送电子邮件。

类似:

function onEdit()
  var s = SpreadsheetApp.getActiveSpreadsheet();
  var ss = s.getSheetByName("Other Sheet Name");
  if(e.range.getColumn()==3 && e.value=='Yes')  //change this if the data setup is different on the other sheet
    sendNotification();
  

问题在于,此设置随后会向电子邮件表上的每个“是”发送一封电子邮件。这可以使用“Email_Sent”指示符来纠正(您可以查看 - 有很多示例可用)。

**正如我在the last question 中提到的,另一个选项是让sendNotification 函数每分钟、5 分钟、10 分钟或 ?这不会提供即时电子邮件,但几乎是这样。

【讨论】:

谢谢罗恩,我更喜欢第二个选项,时间触发器,我试过了,但由于某种原因它不起作用。 给你 - docs.google.com/spreadsheets/d/… 您是否尝试设置基于时间的触发器?脚本编辑器中没有任何活动。我设置了一个每 5 分钟运行一次。 我因为它们不工作而删除了它们,因为我收到了大量的错误通知 好的。在我考虑这个问题时,我发现基于时间的触发器也可能不适用于这种情况。它将与 onEdit 有相同的问题,因为您的 sendNotification 函数正在寻找特定的单元格,如果错误的单元格处于活动状态,您将不会收到任何电子邮件或错误项目的电子邮件。最好只使用“Email_Sent”代码。这将防止重复/错误。

以上是关于在非手动更改/编辑单元格时触发脚本 - 谷歌脚本的主要内容,如果未能解决你的问题,请参考以下文章

从远程 onedit 可安装触发器访问其他谷歌电子表格

删除多个单元格时不会发生 Excel 工作表更改事件

从引用的单元格更改单元格时,如何突出显示该单元格?

在运行应用程序时编辑单元格时更新数组

QTableWidget:用于检测单元格编辑开始的信号

选择单元格时,更改 QTableView 中图标的颜色突出显示