gpt4 book ai didi

javascript - 如果更新了具有值触发器的行中的任何单元格,sendNotification 将继续发送电子邮件

转载 作者:行者123 更新时间:2023-11-30 06:21:15 25 4
gpt4 key购买 nike

当“G”列的值为“所有组件到 DC”时,我正在使用 sendNotification 触发电子邮件。但是,我遇到的问题是,当该列已经有数据“DC 的所有组件”并且同一行中的另一列已更新(具有任何值)时,脚本再次检查列“G”并看到“DC' 的所有组件并重新发送同一封电子邮件。

需要如何重写脚本,以便仅在“G”列更新时发送通知并忽略同一行中的其他单元格?

function sendNotification(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var cell = ss.getActiveCell().getA1Notation();
var row = sheet.getActiveRange().getRow();
var cellvalue = ss.getActiveCell().getDisplayValue().toString();

if(sheet.getRange('G'+row).getValue()=='All Components at DC')
{
var recipients = "xxx@xxx.com";
var subject = "Delivered Items"
var message = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue() + '\n TITLE: ' + sheet.getRange('F'+ sheet.getActiveCell().getRowIndex()).getValue() + '\n LANGUAGE: ' + sheet.getRange('E'+ sheet.getActiveCell().getRowIndex()).getValue()
var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + '\n ROW: ' + row + '\n DATE: ' + message + '\n COMMENT: ' + cellvalue;
var valColB=e.range.getSheet().getRange(e.range.getRow(),2).getValue();
MailApp.sendEmail(recipients, subject, body);
}
}

最佳答案

这个答案怎么样?

  • sendNotification() 作为 OnEdit 的可安装触发器安装。
  • 您只想在“G”列的单元格更新时运行 sendNotification()

如果我对你的情况的理解是正确的,这个修改怎么样?

来自:

if(sheet.getRange('G'+row).getValue()=='All Components at DC')

收件人:

if(cell[0] == 'G' && sheet.getRange('G'+row).getValue()=='All Components at DC')

在此修改中,if 中的脚本仅在通过添加 cell[0] == 'G' 编辑列“G”时运行。

作为另一种修改,您还可以使用 OnEdit 的事件对象。以下示例脚本使用事件对象。当使用事件对象时,可以降低处理成本。

使用事件对象的示例脚本:

function sendNotification(e) {
var ss = e.source;
var sheet = ss.getActiveSheet();
var range = e.range;
var values = range.offset(0, -6, 1, 6).getValues()[0];
var activeCell = range.getValue();
if (range.getA1Notation()[0] == 'G' && activeCell == 'All Components at DC') {
var recipients = "xxx@xxx.com";
var subject = "Delivered Items";
var message = values[0] + '\n TITLE: ' + values[5] + '\n LANGUAGE: ' + values[4];
var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + '\n ROW: ' + range.getRow() + '\n DATE: ' + message + '\n COMMENT: ' + activeCell;
var valColB=e.range.getSheet().getRange(e.range.getRow(),2).getValue();
MailApp.sendEmail(recipients, subject, body);
}
}

引用资料:

如果这不是您想要的,请告诉我。我想修改它。

编辑:

关于这种情况的问题:

事件对象具有已编辑单元格的旧值。但在您的情况下,用作触发器的单元格不是已编辑的单元格。例如,在“I”到“L”列的值为Delivered to DC的情况下,当Delivered to DC被放入“M”列时G列的值由In Progress变为All Components at DC,返回M列被编辑的事件对象。所以旧值和新值不是“G”列的值。并且当触发器检索到列“G”的值时,该值是更改后的值。通过那些,在这种情况下,当使用事件对象和触发器时,检索更改后的“G”列的值。

解决方法:

为了避免上述问题,这个解决方法怎么样?在这个解决方法中,我想建议在编辑之前保存“G”列的值。为此,我使用了一个专栏。尽管有多种方法,但我认为此解决方法更为简单。此解决方法的流程如下。

  1. 首先,使用函数将“G”列的当前值保存到一个列中。这是此流程的初始化。
    • 在此示例中,“N”列用作在编辑前保存值的列。
  2. 启动可安装触发器时,它会从“N”列中检索过去的值并将其与新值进行比较。当新值更改为 All Components at DC 时,它会在 if 中运行脚本并发送电子邮件。
  3. 将“N”列的值更新为当前值。

当上述流程反射(reflect)到您的脚本中时,请修改如下。也可以修改使用事件对象的脚本,如下面的脚本。

修改后的脚本:

// Added
function saveCurrentValues() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tracker");
var values = sheet.getRange(2, 7, sheet.getLastRow(), 1).getValues();
sheet.getRange(2, 14, values.length, 1).setValues(values);
}

function sendNotification(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var cell = ss.getActiveCell().getA1Notation();
var row = sheet.getActiveRange().getRow();
var cellvalue = ss.getActiveCell().getDisplayValue().toString();
var beforeEdit = sheet.getRange(1, 14, sheet.getLastRow(), 1).getValues(); // Added
if(sheet.getName()=='Tracker' && sheet.getRange('G'+row).getValue()=='All Components at DC' && beforeEdit[row - 1][0] != 'All Components at DC') // Modified
{
var recipients = "xxx@xxx.com";
var subject = "New Components Delivered to DC"
var message = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue() + '\n TITLE: ' + sheet.getRange('F'+ sheet.getActiveCell().getRowIndex()).getValue() + '\n LANGUAGE: ' + sheet.getRange('E'+ sheet.getActiveCell().getRowIndex()).getValue()
var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + '\n ROW: ' + row + '\n TVD DATE: ' + message + '\n COMMENT: ' + cellvalue;
var valColB=e.range.getSheet().getRange(e.range.getRow(),2).getValue();
MailApp.sendEmail(recipients, subject, body);
}
saveCurrentValues(); // Added
}

备注:

  • saveCurrentValues() 用于保存“G”列的当前值。因此,在复制并粘贴上述脚本后,首先请运行 saveCurrentValues()。由此,当前值被保存到“N”列。
    • “N”列用作示例。所以请修改你的环境。您也可以隐藏该列。
  • 在此变通方法中,当列“G”的值从 All Components at DC 更改为其他值且未更改时,if 中的脚本是不跑。因此不会发送电子邮件。

关于javascript - 如果更新了具有值触发器的行中的任何单元格,sendNotification 将继续发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com