编辑特定工作表时发送电子邮件提醒 - Google 表格

问题描述 投票:0回答:1

我在精炼脚本时遇到困难,仅在将任何文本输入到特定工作表(名为“Washouts”)时发送电子邮件,并且该文本由另一个脚本(

mergeAndClearRows()
,如下)继承,而不是手动输入。 目前,当在任何单元格、任何和所有选项卡上输入任何文本时,它都会发送电子邮件,而不是仅限于“Washouts”表。

function sendEmailOnEdit(e) {
  var sheetName = "Washouts"; // Sheet Name
  var sheet = e?.source?.getSheetByName(sheetName);
  
  if (sheet) {
    var range = e.range;
    var editedValue = range.getValue();

    // Check if any text (non-empty) is entered
    if (editedValue !== "") {
      // Tailor message
      var message = 'Text entered in the Washouts sheet: ' + editedValue;
      var subject = 'message body alert';

      // Email entry
      var recipientEmail = 'myemailaddyhere';

      // Send the email
      MailApp.sendEmail(recipientEmail, subject, message);
    }
  }
}

这是我正在使用的脚本,已经修改了近 50 次,但结果相同。即使正确设置了手动触发器,它也不限制对冲刷表的编辑。

基本上,如果卡车需要清洗,则会选中一个复选框,选中后,单击该行,单击菜单项“完成装载”,然后将该行带到另外 2 张表,而不仅仅是“完成装载”选项卡。然后它也会作为副本转移到“冲洗”选项卡。这一切都工作正常,但我希望它在有人将副本发送到“清洗”选项卡时向我发送一封电子邮件,以便让我知道。 除了在任何工作表上输入任何单元格时发送电子邮件之外,一切正常。

function mergeAndClearRows() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var rowIdx = sheet.getActiveRange().getRowIndex();
  var rowValues = sheet.getRange(rowIdx, 1, 1, sheet.getLastRow()).getValues();
  
  // Checkbox column is currently U (adjust if I do move to the end)
  var checkboxValue = rowValues[0][20]; // Column U (index 20)
  
  // Initialize destValues array
  // need to adjust later to slim down washout copies, not sure how yet without extending script run time.
  var destValues = [
    rowValues[0][0], rowValues[0][1], rowValues[0][2], rowValues[0][3],
    rowValues[0][4], rowValues[0][5], rowValues[0][6], rowValues[0][7],
    rowValues[0][8], rowValues[0][9], rowValues[0][10], rowValues[0][11],
    rowValues[0][12], rowValues[0][13], rowValues[0][14], rowValues[0][15],
    rowValues[0][16], rowValues[0][19]
    // Add more values as needed
  ];
  
  // second copy for washouts if box is checked
  if (checkboxValue === true) {
    var destWashouts = spreadsheet.getSheetByName('Washouts');
    destWashouts.getRange(destWashouts.getLastRow() + 1, 1, 1, destValues.length).setValues([destValues]);
    
    // Set value column Q
    sheet.getRange(rowIdx, 17).setValue(false);
  }
  
  // Completed Loads if U = false
  var destCompletedLoads = spreadsheet.getSheetByName('Completed Loads');
  destCompletedLoads.getRange(destCompletedLoads.getLastRow() + 1, 1, 1, destValues.length).setValues([destValues]);
  
  // Clear content
  var rangeToClear = sheet.getRange(rowIdx, 9, 1, 7);
  rangeToClear.clearContent();
  
  // Clear U
  sheet.getRange(rowIdx, 21).setValue(false);
  
  // Clear content in column T (index 20) regardless of checkbox status
  sheet.getRange(rowIdx, 20).clearContent();
}
function google-sheets appscript
1个回答
0
投票

e.source
返回事件发生的电子表格 - 电子表格,而不是工作表。所以这行:

var sheet = e?.source?.getSheetByName("Washouts");

;与做的一样:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Washouts");

换句话说,无论事件是否发生在该表中,您都可以访问该表。

要访问发生事件的工作表,您可以使用

e.range.getSheet()
,然后使用
getName()
获取其名称。您只需检查它是否确实正确即可。

因此,总而言之,您的函数的以下修改版本应该可以解决问题:

function sendEmailOnEdit(e) {
  const sheetName = e.range.getSheet().getName();  // <-- Changed this line...
  
  if (sheetName === "Washouts") {  // <-- ...and this line.
    var range = e.range;
    var editedValue = range.getValue();

    // Check if any text (non-empty) is entered
    if (editedValue !== "") {
      // Tailor message
      var message = 'Text entered in the Washouts sheet: ' + editedValue;
      var subject = 'message body alert';

      // Email entry
      var recipientEmail = 'myemailaddyhere';

      // Send the email
      MailApp.sendEmail(recipientEmail, subject, message);
    }
  }
}

参考文献

© www.soinside.com 2019 - 2024. All rights reserved.