Google App 脚本触发单元格值更改

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

我是一个新手,一直在使用一个简单的应用程序脚本来发送带有 onEdit 和 onChange 触发器的电子邮件。但是,我的工作表有十多张工作表,任何工作表中的任何编辑/更改(由我或通过计算完成)都会发送一封电子邮件,从而导致意外的垃圾邮件!为了避免这种情况,如果我可以使用一些代码仅根据特定工作表中特定单元格值的任何更改发送电子邮件,我的问题就会得到解决。我的外发电子邮件很短,整封邮件都在一个单元格 (C2) 中。如果我可以添加一行代码来监视单元格 C2 中的任何更改,并在发生更改时发送电子邮件,就是这样!我就完了。我的脚本如下:

function sendEmail(){ var ss = SpreadsheetApp.getActiveSpreadsheet() var sheet1=ss.getSheetByName('Email'); var emailAddress = sheet1.getRange(2,1).getValue(); var subject = sheet1.getRange(2,2).getValue(); var message = sheet1.getRange(2,3).getValue(); MailApp.sendEmail(emailAddress, subject, message); }
    
google-apps-script google-sheets triggers
3个回答
10
投票
答案:

您可以使用 onEdit()

 和条件来完成此操作。

代码示例:

function onEdit(e) { const specificSheet = "Email" // for example const specificCell = "C2" // for example let sheetCheck = (e.range.getSheet().getName() == specificSheet) let cellCheck = (e.range.getA1Notation() == specificCell) if (!(sheetCheck && cellCheck)) { return } else { sendEmail() } }

此功能的概要:

    定义要检查的特定单元格的工作表和 A1 符号
  • 获取刚刚编辑的单元格的Sheet和A1符号
  • 如果工作表或单元格不是定义的特定单元格,则返回(使用
  • 德摩根定律
  • 如果单元格和工作表正确,则运行
  • sendEmail()
    
    
参考资料:

  • 事件对象 |应用程序脚本 |谷歌开发者
  • 简单的触发器|应用程序脚本 |谷歌开发者
  • 德摩根定律 - 维基百科

2
投票
从答案开始,这就是我的结果,因为我有几个范围需要检查:

function onEdit(e){ if(wasEdited(e, range1)){ // e.g. range1 = "Sheet1!A5" // handle range1 change } if(wasEdited(e, range2)){ // e.g. range2 = "Sheet1!A7" // handle range2 change } } function wasEdited(e, range){ let tab = getTabFromA1Range(range) let cell = getRangeFromA1Range(range) return e.range.getSheet().getName() == tab && e.range.getA1Notation() == cell } function getTabFromA1Range(a1Range){ return a1Range.substring(0, a1Range.indexOf("!")) } function getRangeFromA1Range(a1Range){ return a1Range.substring(a1Range.indexOf("!")+1) }
    

0
投票
经过进一步研究,以下解决方案似乎效果最好:

function sendEmail(){ Utilities.sleep(30000); var ss=SpreadsheetApp.getActiveSpreadsheet(); var data=ss.getActiveSheet().getActiveCell().getA1Notation(); var sheetname = ss.getActiveSheet().getName(); var sheet1=ss.getSheetByName('Email'); var emailAddress = sheet1.getRange(2,1).getValue(); var subject = sheet1.getRange(2,2).getValue(); var message = sheet1.getRange(2,3).getValue(); if(data.indexOf('A:C')!=-1.23456789) { MailApp.sendEmail(emailAddress, subject, message); } };
关键似乎是第10行的“if语句”。请注意我在脚本中添加的半分钟的时间延迟。这是因为如果没有它,在触发器激活时,将发出前一封电子邮件而不是当前电子邮件。显然,我的应用程序在同步方面有轻微的延迟,并且在所有当前数据填充到相关单元格之前触发了触发器!

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