我在精炼脚本时遇到困难,仅在将任何文本输入到特定工作表(名为“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();
}
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);
}
}
}