当前位置: 首页 > 知识库问答 >
问题:

从另一个应用程序(IFTTT)将单元格写入时触发电子邮件

洪华皓
2023-03-14

这就是我一直在做的。我是一名篮球教练,有一个电子表格,可以从IFTTT获取我所有球员的推文。com(它基本上接受twitter列表的RSS提要,当它被更新时,它会更新电子表格)。

我一直在编写代码,基本上是这样写的:“如果一个玩家在推特上发了一个不合适的词,请立即给我发电子邮件。”

我已经知道了密码,如果我输入一个不合适的单词,它会把手机变成红色并给我发邮件。然而,我还没有想出如何让代码在IFTTT自动用推文更新电子表格后给我发电子邮件。

这是我到目前为止的代码。现在我只有一个“触发”词,那就是“玩家”,只是为了让电子表格正常工作。这是代码:

function onEdit(e) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();//Get the spreadsheet
    var sheet = ss.getActiveSheet()//Get the active sheet
    var cell = ss.getActiveCell().activate();//Get the active cell. 
    var badCell = cell.getA1Notation();//Get the cells A1 notation.
    var badCellContent = cell.getValue();//Get the value of that cell. 


    if (badCellContent.match("players")){
        cell.setBackgroundColor("red")
        MailApp.sendEmail("antadrag@gmail.com", "Notice of possible inappropriate tweet", "This tweet       says: " + badCellContent + ".");
    }
}

这是我现在正在使用的电子表格的链接:https://docs.google.com/spreadsheets/d/1g5XaIycy69a3T2YcWhcbBy0hYrxSfoEEz8c4-zP63O8/edit#gid=0非常感谢对此的任何帮助或指导!谢谢!

共有1个答案

尉迟国发
2023-03-14

我最初是为你的上一个问题写这个答案的,所以它包括了你的一些评论的答案,但是既然你继续要求社区一步一步地写这个,下面是下一步。

我遇到的问题是,如果电子表格中同时出现三条推文,我的代码只会更新最近的单元格,而不是全部三条。这有意义吗?

是的,确实有道理。

当一个onEdit()触发器函数调用电子表格服务函数从工作表中获取当前信息时,它会进入一个“竞争条件”。如果在触发了onEdit()的更改之后,工作表中发生了任何更改,并且计划了更改的时间,则这些更改将在运行时可见。这就是当您假设正在处理的更改位于最后一行时所看到的情况—在您处理更改时,可能会出现新的最后一行。

不过,好消息是,传递给onEdit的事件对象的属性包含更改的详细信息。(参数e)请参见事件对象。

通过使用e.rangee.value,您将找到触发触发器的编辑单元格的位置和内容。如果在服务触发器之前到达其他推文,则不会欺骗函数处理最后一行。

在新工作表中,onEdit()可以触发多个单元格更改,例如剪切

在把电子表格都弄好之后

问:什么时候编辑不是编辑?答:当它是由剧本制作的时候。在这种情况下,这是一个变化。您可以在Change函数上添加可安装的来捕获这些事件。不幸的是,更改事件不如编辑事件冗长,因此您必须阅读电子表格以找出更改的内容。我的习惯是让更改处理程序通过构造一个假事件来模拟编辑(就像我们在测试时所做的那样),并将其传递给onEdit函数。

所以试试这个。这个脚本:

  • 处理一系列的坏话。(可以很容易地监控您的产品或原因的提及。)
  • 有一个onEdit()函数,该函数使用事件对象来计算触发函数调用的行。
  • 颜色"坏"推文
  • 有一个用于测试onEdit()触发器的函数,基于如何在GAS中测试触发器函数?
  • 包括playCatchUp(e),这是一个可安装的触发器函数(更改和/或基于时间),它将计算任何以前未计算过的行。脚本属性最后处理行用于跟踪该行值。(如果计划删除行,则需要调整属性。)
  • 是否注释了sendMail函数。

享受

// Array of bad words. Could be replaced with values from a range in spreadsheet.
var badWords = [
  "array",
  "of",
  "unacceptable",
  "words",
  "separated",
  "by",
  "commas"
];

function onEdit(e) {
  if (!e) throw new Error( "Event object required. Test using test_onEdit()" );

  Logger.log( e.range.getA1Notation() );

  // e.value is only available if a single cell was edited
  if (e.hasOwnProperty("value")) {
    var tweets = [[e.value]];
  }
  else {
    tweets = e.range.getValues();
  }
  var colors = e.range.getBackgrounds();

  for (var i=0; i<tweets.length; i++) {
    var tweet = tweets[i][0];
    for (var j=0; j< badWords.length; j++) {
      var badWord = badWords[j];
      if (tweet.match(badWord)) {
        Logger.log("Notice of possible inappropriate tweet: " + tweet);
        colors[i][0] = "red";
        //MailApp.sendEmail(myEmail, "Notice of possible inappropriate tweet", tweet);
        break;
      }
    }
  }
  e.range.setBackgrounds(colors);
  PropertiesService.getDocumentProperties()
                   .setProperty("Last Processed Row",
                                (e.range.getRowIndex()+tweets.length-1).toString());
}

// Test function, adapted from https://stackoverflow.com/a/16089067/1677912
function test_onEdit() {
  var fakeEvent = {};
  fakeEvent.authMode = ScriptApp.AuthMode.LIMITED;
  fakeEvent.user = "amin@example.com";
  fakeEvent.source = SpreadsheetApp.getActiveSpreadsheet();
  fakeEvent.range = fakeEvent.source.getActiveSheet().getDataRange();
  // e.value is only available if a single cell was edited
  if (fakeEvent.range.getNumRows() === 1 && fakeEvent.range.getNumColumns() === 1) {
    fakeEvent.value = fakeEvent.range.getValue();
  }

  onEdit(fakeEvent);
}

// Installable trigger to handle change or timed events
// Something may or may not have changed, but we won't know exactly what
function playCatchUp(e) {
  // Check why we've been called
  if (!e)
    Logger.log("playCatchUp called without Event");
  else {
    // If onChange and the change is an edit - no work to do here
    if (e.hasOwnProperty("changeType") && e.changeType === "EDIT") return;

    // If timed trigger, nothing special to do.
    if (e.hasOwnProperty("year")) {
      var date = new Date(e.year, e.month, e["day-of-month"], e.hour, e.minute, e.second); 
      Logger.log("Timed trigger: " + date.toString() );
    }
  }

  // Find out where to start processing tweets
  // The first time this runs, the property will be null, yielding NaN
  var lastProcRow = parseInt(PropertiesService.getDocumentProperties()
                         .getProperty("Last Processed Row"));
  if (isNaN(lastProcRow)) lastProcRow = 0;

  // Build a fake event to pass to onEdit()
  var fakeEvent = {};
  fakeEvent.source = SpreadsheetApp.getActiveSpreadsheet();
  fakeEvent.range = fakeEvent.source.getActiveSheet().getDataRange();
  var numRows = fakeEvent.range.getLastRow() - lastProcRow;
  if (numRows > 0) {
    fakeEvent.range = fakeEvent.range.offset(lastProcRow, 0, numRows);
    onEdit(fakeEvent);
  }
  else {
    Logger.log("All caught up.");
  }  
}

 类似资料:
  • 我是一名篮球教练 这是一个不合适的单词的代码,很明显,我只是想在添加100个不合适的单词之前把编码的基本知识记下来。问题是,如果工作表同时收到三条推文,它只会检查最后一条,所以这就是我现在的主要问题所在。 非常感谢这里的任何指导或帮助!

  • 问题内容: 在我的AngularJS Web应用程序之一中,我需要通过向相关人员发送电子邮件来确认密码。如何在AngularJS中实现呢?我是.NET专家,正在使用Visual Studio 2013。 问题答案: 我已经通过网络服务实现了,请参考下面的代码片段 和ajax调用为

  • 我正试图建立一个项目跟踪系统 发送电子邮件到电子邮件列表 邮件标题为单元格A1中的文本 邮件正文是来自单元格D1的文本 当单元格E1的值变为完成或注意时触发 到目前为止,我已经创建了一个脚本,可以向特定工作表中创建的人员列表发送电子邮件。但我正在为OnEdit功能和如何在发送电子邮件时将单元格链接成一行而苦苦挣扎。电子表格将有许多行引用不同的项目。 非常感谢您的帮助和建议。

  • 问题内容: 我确信你们中有人注意到,如果您有Acrobat Reader(或其他PDF阅读器),并在Firefox中打开一个PDF,您会看到它嵌入在您的标签中。有什么方法可以将应用程序嵌入JFrame中? 问题答案: 这是一个相当棘手的问题。通常,诸如Adobe Reader之类的本机应用程序不提供可以嵌入到swing应用程序中的组件。但是在Windows中,有COM / OLE方法可以将应用程序

  • 我什么都试过了,但还是做不到 我试图使用setValues()将数据从一个电子表格复制到另一个电子表格,因为link对我不起作用。我还需要保持触发器的编辑。 因此,我创建了一个名为AddConvocacao的函数,并且总是在有任何更改时运行脚本。 为什么我在编辑时使用不起作用? 非常感谢!=)