javascript - 如何获取生成的日历 ID 的值,然后根据其行索引将其推送到变量?
问题描述
客观的
- 使用 Google 表单、表格和日历创建预订系统
- 当有新的提交时,会自动创建日历事件。
- 受访者还可以编辑他们的提交(编辑表单 URL)。
- 编辑时,旧事件将被删除,然后将创建新事件。
当前问题
- 当编辑一行时,updateCalendar() 函数也会循环遍历整个数据范围;从第一行删除事件。
如何确保该功能仅适用于正在编辑的行?
这就是工作表的第一行的样子。
时间戳 | 电子邮件地址 | 姓名 | 登记日期 | 离开日期 | 房间 | 人数 | 总天数 | 全部的 | 编辑网址 | 事件冲突 | 事件编号 |
---|
试错
目前,我正在努力处理这段代码:
- 将生成的编辑 URL(从其他函数)推送到变量urls
- 将生成的事件 ID 推送到变量ids
- 匹配urls和ids的索引,将其分配给变量resultIds并删除。
这是执行上述功能的代码的一部分
var urls = [], ids = [], resultIds = [];
urls.push(values[i][9]);
ids.push(newEventId);
resultIds.push([values[i][9]?ids[urls.indexOf(values[i][9])]:'']);
这是将更新日历的完整功能:(非常感谢任何帮助,在此先感谢)
function updateCalendar(request) {
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var range = sheet.getRange(2,1,lastRow,13);
var values = range.getDisplayValues();
var calendar = CalendarApp.getCalendarById('c_qsk903qma3b8mp5ensa7bvvg4k@group.calendar.google.com');
var urls = [], ids = [], editIds = [];
getConflicts(request);
for (var i = 0; i < values.length; i++) {
urls.push(values[i][9]);
if (request.eventConflict == "conflict" && values[i][12] != "sent") {
sheet.getRange(lastRow,11).setValue("conflict");
break;
} else if (request.eventConflict == "approve" && values[i][12] != "sent") {
var newEvent = calendar.createEvent("booked", request.date, request.endTime);
var newEventId = newEvent.getId().split('@')[0];
sheet.getRange(lastRow,11).setValue("approve");
sheet.getRange(lastRow,12).setValue(newEventId);
ids.push(newEventId);
break;
} else if (request.eventConflict == "conflict" && values[i][10] == "approve" && values[i][12] == "sent") {
editIds.push([values[i][0]?ids[urls.indexOf(values[i][0])]:'']);
var eventEditId = calendar.getEventSeriesById(values[i][11]);
eventEditId.deleteEventSeries();
sheet.getRange(i+2,11).setValue("");
sheet.getRange(i+2,13).setValue("");
getConflicts(request);
if (request.eventConflict == "approve") {
var newEvent = calendar.createEvent("booked", request.date, request.endTime);
var newEventId = newEvent.getId().split('@')[0];
sheet.getRange(i+2,11).setValue("approve");
sheet.getRange(i+2,12).setValue(newEventId);
break;
} else {
sheet.getRange(i+2,11).setValue("conflict");
break;
}
}
}
};
解决方案
我在同一个电子表格中使用了两张表,然后使用 e.range 方法检索已编辑行的索引。这是代码
function updateCalendarTwo(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var responsename = "Main sheet"
var copyname = "Copy Sheet";
var responsesheet = ss.getSheetByName(responsename);
var copysheet = ss.getSheetByName(copyname);
var calendar = CalendarApp.getCalendarById('Your Calendar ID');
// columns on copysheet
var checkInCol = 4;
var checkOutCol = 5;
var roomNumCol = 6;
var appCol = 11
var eventIDCol = 12;
var revCol = 14;
var response = e.range;
var rRow = response.getRow()
var rLC = responsesheet.getLastColumn();
var cLC = copysheet.getLastColumn();
var rLR = responsesheet.getLastRow();
var cLR = copysheet.getLastRow();
if (rLR > cLR){
var resprange = responsesheet.getRange(rLR,1,1,rLC);
var respdata = resprange.getValues();
copysheet.appendRow(respdata[0]);
var eventTitle = copysheet.getRange(rRow,roomNumCol).getValue();
var startDate = copysheet.getRange(rRow,checkInCol).getValue();
var endDate = copysheet.getRange(rRow,checkOutCol).getValue().getTime()+ 24 * 60 * 60 * 1000;
var conflicts = calendar.getEvents(new Date(startDate), new Date(endDate));
if (conflicts.length < 1) {
var event = calendar.createAllDayEvent(eventTitle, new Date(startDate), new Date(endDate));
var eventID = event.getId().split('@')[0];
copysheet.getRange(rRow,appCol).setValue("approve");
copysheet.getRange(rRow,eventIDCol).setValue(eventID);
} else {
copysheet.getRange(rRow,appCol).setValue("conflict");
}
} else {
var resprange = responsesheet.getRange(rRow,1,1,9);
var respdata = resprange.getValues();
var copyrespRange = copysheet.getRange(rRow,1,1,9);
copyrespRange.setValues(respdata);
var respAppRange = copysheet.getRange(rRow,appCol);
var respApp = respAppRange.getValue();
if (respApp == 'conflict') {
var eventTitle = copysheet.getRange(rRow,roomNumCol).getValue();
var startDate = copysheet.getRange(rRow,checkInCol).getValue();
var endDate = copysheet.getRange(rRow,checkOutCol).getValue().getTime()+ 24 * 60 * 60 * 1000;
var conflicts = calendar.getEvents(new Date(startDate), new Date(endDate));
if (conflicts.length < 1) {
var editedEvent = calendar.createAllDayEvent(eventTitle, new Date(startDate), new Date(endDate));
var editedEventID = editedEvent.getId().split('@')[0];;
copysheet.getRange(rRow,appCol).setValue("edited");
copysheet.getRange(rRow,eventIDCol).setValue(editedEventID);
} else {
copysheet.getRange(rRow,appCol).setValue("conflict");
};
} else {
var eventEditId = copysheet.getRange(rRow,eventIDCol).getDisplayValue();
var editedEvent = calendar.getEventSeriesById(eventEditId);
editedEvent.deleteEventSeries();
var eventTitle = copysheet.getRange(rRow,roomNumCol).getValue();
var startDate = copysheet.getRange(rRow,checkInCol).getValue();
var endDate = copysheet.getRange(rRow,checkOutCol).getValue().getTime()+ 24 * 60 * 60 * 1000;
var conflicts = calendar.getEvents(new Date(startDate), new Date(endDate));
if (conflicts.length < 1) {
var editedEvent = calendar.createAllDayEvent(eventTitle, new Date(startDate), new Date(endDate));
var editedEventID = editedEvent.getId().split('@')[0];;
copysheet.getRange(rRow,appCol).setValue("edited");
copysheet.getRange(rRow,eventIDCol).setValue(editedEventID);
} else {
copysheet.getRange(rRow,appCol).setValue("conflict");
};
};
}
}
推荐阅读
- jquery - 每次访问运行一次函数
- reactjs - 可以在没有连接的情况下分派一个动作吗?
- java - “线程“主”java.lang.NoSuchMethodError 中的异常:org.openqa.selenium.remote.HttpCommandExecutor。
(Ljava/util/Map;Ljava/net/URL;)V”? - json - MongoDb 句柄无效
- linux - Bash:按特定列中的值过滤gz文件
- c - 在c中打印锯齿状数组
- mysql - 当密钥不是 MySql 中的主键时,“更新时重复其他插入”
- vue.js - 带有组件和元素 UI 的 Vue Js 表单验证
- database-design - 如何处理“可选”循环引用
- linux - 无法在适用于 Linux 的 Windows 子系统上使用 gdb 在 VS Code 上调试 C