这就是我一直在做的。我是一名篮球教练,有一个电子表格,可以从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非常感谢对此的任何帮助或指导!谢谢!
我最初是为你的上一个问题写这个答案的,所以它包括了你的一些评论的答案,但是既然你继续要求社区一步一步地写这个,下面是下一步。
我遇到的问题是,如果电子表格中同时出现三条推文,我的代码只会更新最近的单元格,而不是全部三条。这有意义吗?
是的,确实有道理。
当一个onEdit()
触发器函数调用电子表格服务函数从工作表中获取当前信息时,它会进入一个“竞争条件”。如果在触发了onEdit()
的更改之后,工作表中发生了任何更改,并且计划了更改的时间,则这些更改将在运行时可见。这就是当您假设正在处理的更改位于最后一行时所看到的情况—在您处理更改时,可能会出现新的最后一行。
不过,好消息是,传递给onEdit
的事件对象的属性包含更改的详细信息。(参数e
)请参见事件对象。
通过使用e.range
和e.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的函数,并且总是在有任何更改时运行脚本。 为什么我在编辑时使用不起作用? 非常感谢!=)