当 Google Sheet 被 IFTTT 更新时设置触发器
Setting up a trigger when a Google Sheet gets updated by IFTTT
我正在使用 IFTTT 在收到短信时更新我的 Google Sheet。现在,我想向前迈出一步,编写一个 Google Apps 脚本,它将对 IFTTT 更新的数据执行不同的操作,并将其写入我的 Google Sheet。我尝试使用 Google Apps 脚本的 onEdit
函数来实现相同的目的,但这不起作用。
关于这个问题,我在多个论坛上进行了大量搜索,我了解到 onEdit
仅在 "user" 对 Google Sheet 进行更改时有效,而不是更改是通过 API 请求完成的(我相信 IFTTT 使用相同的请求)。我什至看不到一个 post 的有效解决方案。
有什么想法吗?谢谢!
经过大量 Google 搜索,我发现下面的代码对我有用。它的灵感来自 Mogsdad 的 this answer。
function myOnEdit(e) {
if (!e) throw new Error( "Event object required. Test using test_onEdit()" );
// e.value is only available if a single cell was edited
if (e.hasOwnProperty("value")) {
var cells = [[e.value]];
}
else {
cells = e.range.getValues();
}
row = cells[cells.length - 1];
// Do anything with the row data here
}
function test_onEdit() {
var fakeEvent = {};
fakeEvent.authMode = ScriptApp.AuthMode.LIMITED;
fakeEvent.user = "hello@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) {
// Build a fake event to pass to myOnEdit()
var fakeEvent = {};
fakeEvent.source = SpreadsheetApp.getActiveSpreadsheet();
fakeEvent.range = fakeEvent.source.getActiveSheet().getDataRange();
myOnEdit(fakeEvent);
}
希望这对以后的人有所帮助。请注意,playCatchUp
和 myOnEdit
函数必须在 Google Apps 脚本中分别设置为 "change" 和 "edit" 操作触发器。
我正在使用 IFTTT 在收到短信时更新我的 Google Sheet。现在,我想向前迈出一步,编写一个 Google Apps 脚本,它将对 IFTTT 更新的数据执行不同的操作,并将其写入我的 Google Sheet。我尝试使用 Google Apps 脚本的 onEdit
函数来实现相同的目的,但这不起作用。
关于这个问题,我在多个论坛上进行了大量搜索,我了解到 onEdit
仅在 "user" 对 Google Sheet 进行更改时有效,而不是更改是通过 API 请求完成的(我相信 IFTTT 使用相同的请求)。我什至看不到一个 post 的有效解决方案。
有什么想法吗?谢谢!
经过大量 Google 搜索,我发现下面的代码对我有用。它的灵感来自 Mogsdad 的 this answer。
function myOnEdit(e) {
if (!e) throw new Error( "Event object required. Test using test_onEdit()" );
// e.value is only available if a single cell was edited
if (e.hasOwnProperty("value")) {
var cells = [[e.value]];
}
else {
cells = e.range.getValues();
}
row = cells[cells.length - 1];
// Do anything with the row data here
}
function test_onEdit() {
var fakeEvent = {};
fakeEvent.authMode = ScriptApp.AuthMode.LIMITED;
fakeEvent.user = "hello@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) {
// Build a fake event to pass to myOnEdit()
var fakeEvent = {};
fakeEvent.source = SpreadsheetApp.getActiveSpreadsheet();
fakeEvent.range = fakeEvent.source.getActiveSheet().getDataRange();
myOnEdit(fakeEvent);
}
希望这对以后的人有所帮助。请注意,playCatchUp
和 myOnEdit
函数必须在 Google Apps 脚本中分别设置为 "change" 和 "edit" 操作触发器。