javascript - 谷歌脚本在编辑或删除后检测空单元格
问题描述
我的代码有问题。看起来很好,但它不起作用,我真的不知道为什么。我什么都试过了。
我想将我的 google excel 与我的 google 日历同步。一切正常,但现在我想在我只编辑空白单元格时在日历中制作事件:
if (e.oldValue == null) { // also tried if(e.oldValue == undefinded)
var date = new Date(dayRange);
cal.createAllDayEvent(
e.value,
date,
)
}
它工作正常。但是接下来我想在删除单元格时从日历中删除事件(所以它又是空白的):
else if(e.value==null){
var events = cal.getEvents(date, {
search: ss.getRange(row,2)
});
for (i in events){
events[i].deleteEvent();
}
在我“删除”日历中的单元格后,我得到下一个带有闪烁标题的事件,我不知道为什么会创建这个事件。似乎这个“else if”不起作用。我真的不知道为什么。我阅读了所有示例,代码似乎还可以。
这就是我创建触发器的方式:
function createEditTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('ToCalendar')
.forSpreadsheet(ss)
.onEdit()
.create();
}
我将非常感谢所有的建议。
编辑
完整代码:
function ToCalendar(e) {
var ss = SpreadsheetApp.getActiveSheet();
var cal = CalendarApp.getCalendarById("myID");
var range = e.range;
var column = range.getColumn();
var row = range.getRow();
var day = ss.getRange(1,column);
var dayRange = day.getValues();
if ((e.value != null) && (e.oldValue == null)) {
var date = new Date(dayRange);
cal.createAllDayEvent(
ss.getRange(row,2).getValue(),
date,
{
description: e.value,//ss.getRange(row, column).getValue(),
}
)
}
//If we edit cell:
else if(e.oldValue!=undefined){
var events= cal.getEventsForDay(date,{search: e.oldValue});
var ev= events[0];
Logger.log(ev);
ev.deleteEvent();
cal.createAllDayEvent(ss.getRange(row,2).getValue(),date,
{description: ss.getRange(row, column).getValue()})
// If we delete cell
else if((e.value == null) && (e.oldValue != null)){
var events = cal.getEvents(date, {
search: ss.getRange(row,2)
});
for (i in events){
events[i].deleteEvent();
}
}
创建触发器:
function createEditTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('ToCalendar')
.forSpreadsheet(ss)
.onEdit()
.create();
}
解决方案
您想为编辑空单元格的情况和删除单元格值的情况运行每个函数。如果我的理解是正确的,这个解决方法怎么样?我认为可能有几种解决方法。因此,请将此视为其中之一。在此解决方法中,它假设您正在使用onEdit(e)
. 当单元格改变时,e
ofonEdit(e)
改变如下。
在将值编辑为空单元格的情况下
e.value
包含在e
.e.oldValue
不包含在e
.
在用其他值覆盖一个值的单元格的情况下
e.value
和都e.oldValue
包含在e
.
在从具有值的单元格中删除值的情况下
- 两者
e.value
和e.oldValue
都不包含在e
.
- 两者
使用上述结果,为了在编辑空单元格和删除单元格值的情况下运行每个函数,您可以使用以下示例脚本。
示例脚本:
function onEdit(e) {
if (("value" in e) && !("oldValue" in e)) {
Logger.log("In the case for editing a value to empty cell")
}
if (!("value" in e) && !("oldValue" in e)) {
Logger.log("In the case for deleting a value from a cell with a value")
}
}
当然,您也可以使用以下脚本。
function onEdit(e) {
if ((e.value != null) && (e.oldValue == null)) {
Logger.log("In the case for editing a value to empty cell")
}
if ((e.value == null) && (e.oldValue == null)) {
Logger.log("In the case for deleting a value from a cell with a value")
}
}
笔记 :
- 如果要运行需要授权的方法,请安装触发器到
onEdit()
.
参考 :
如果我误解了你的问题,我很抱歉。
编辑 :
语法错误已删除并修改了您的脚本。在这个修改后的脚本中,
- 编辑空单元格时,将
if ((e.value != null) && (e.oldValue == null)) { script }
运行脚本。 - 当具有值的单元格被值覆盖时,将
else if(e.oldValue!=undefined) { script }
运行脚本。 - 当删除带有值的单元格的值时,将
else if((e.value == null) && (e.oldValue == null)) { script }
运行脚本。
修改后的脚本:
function ToCalendar(e) {
var ss = SpreadsheetApp.getActiveSheet();
var cal = CalendarApp.getCalendarById("myID");
var range = e.range;
var column = range.getColumn();
var row = range.getRow();
var day = ss.getRange(1,column);
var dayRange = day.getValues();
if ((e.value != null) && (e.oldValue == null)) { // When the empty cell is edited, this becomes true.
var date = new Date(dayRange);
cal.createAllDayEvent(ss.getRange(row,2).getValue(),date,{
description: e.value,//ss.getRange(row, column).getValue(),
})
// In your situation, this might not be required.
} else if(e.oldValue!=undefined) { // When the cell with a value is overwritten by a value, this becomes true.
//If we edit cell:
var events= cal.getEventsForDay(date,{search: e.oldValue});
var ev= events[0];
Logger.log(ev);
ev.deleteEvent();
cal.createAllDayEvent(ss.getRange(row,2).getValue(),date,{description: ss.getRange(row, column).getValue()})
} else if((e.value == null) && (e.oldValue == null)) { // When the value of cell with a value is removed, this becomes true.
// If we delete cell
var events = cal.getEvents(date, {
search: ss.getRange(row,2)
});
for (i in events){
events[i].deleteEvent();
}
}
}
添加:
已确认事件对象的规范已更改。确认了以下修改。@I'-'I提到了这一点。
从:
- 在从具有值的单元格中删除值的情况下
- 两者
e.value
和e.oldValue
都不包含在e
.
- 两者
到:
- 在从具有值的单元格中删除值的情况下
e.value
并e.oldValue
包含在e
.e.value
是一个像{"oldValue":"deleted value"}
.e.oldValue
是一个字符串,如"deleted value"
.
通过这种修改,当值从具有该值的单元格中删除时,可以通过以下脚本进行检查。
if (e.value.oldValue) {
// value was removed from cell.
} else {
// value is NOT removed from cell.
}
笔记 :
- 在将一个值编辑为空单元格的情况下,以及用另一个值覆盖一个值的单元格的情况下,每个结果都不会改变。
推荐阅读
- javascript - Vue 对象更改,但不会重新渲染
- c - 为什么这个内核映像不能在 QEMU 上启动
- node.js - NodeJS 配置默认环境
- python - 有没有办法在python中洗牌?
- javascript - NodeJS + Mongo - 如何与我的 DOM 从数据库中获取数据进行交互?
- scala - 如何将 S3 存储桶中的 csv 文件转换为 RDD
- bitmap - 在位板上找到对角线的计算可行方法
- c# - 我如何在不同的班级中使用按钮、计时器等
- r - 从 GitHub 错误安装包 - 可能是文件路径
- python - 直接播种 CPython 的 Mersenne Twister