如何防止 Google 表格和日历之间的 Apps 脚本重复预订
How to prevent Double Booking in Apps Script between Google Sheets and Calendar
我正在制作一个电子表格,它可以帮助我们自动安排会议。我想确保我的团队不会将会议安排在同一日期和时间。如何将其添加到我现有的可用代码中? (我在任何地方都找不到这个答案!!)
function addEvents(){
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
var cal = CalendarApp.getCalendarById("c_kdaqhj8lkd7u68s8thinbnjpik@group.calendar.google.com");
var data = ss.getRange("A2:F"+ lr).getValues();
for(var i = 0;i<data.length;i++){
if(cal.getEvents(data[i][1], data[i][2])==null || cal.getEvents(data[i][1], data[i][2]).length==0 ){
cal.createEvent(data[i][0], data[i][1], data[i][2],{guests: ''+data[i][3]+','+data[i][4]+'', description:data[i][5]});
}
}
}
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Sync to Calendar')
.addItem('Schedule events now', 'addEvents')
.addToUi()
}
谢谢!
我的回答与 Cooper 提供的类似,所以我将发布此内容以帮助您 sheet 正确维护。
我在 onEdit()
期间添加了一个行为,当用户在 sheet 中添加一组现有的开始和结束日期时,最近的 added/edited 行会自动删除。
这可以减少对日历的调用次数,但代价是在编辑期间不断检查 sheets。
欢迎使用下面的代码
function onEdit(e) {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var currentSheet = SpreadsheetApp.getActiveSheet();
var cell = currentSheet.getActiveCell();
var cellValue = cell.getValue();
var date, dates, occurences, limit;
// newly added date in active sheet
if (cell.getColumn() == 2) {
date = [cellValue, cell.offset(0, 1).getValue()];
}
else if (cell.getColumn() == 3) {
date = [cell.offset(0, -1).getValue(), cellValue];
}
// traverse other sheets
sheets.forEach(function(sheet){
var sheetName = sheet.getName();
// dates from other sheets
dates = sheet.getRange(2, 2, sheet.getLastRow(), 2).getValues();
occurences = 0;
// check if dates in other sheets have the newly added date
for(var index in dates){
if(JSON.stringify(dates[index]) === JSON.stringify(date)) {
// increment if found
occurences++;
}
}
if(sheet.getName() != currentSheet.getName()) {
// should not occur in other sheets
limit = 0;
}
else {
// should occur at most once in the active sheet
limit = 1;
}
// if date was found more than the limit
if (occurences > limit) {
// prompt user that the newly added date is present in other sheets
SpreadsheetApp.getUi().alert('WARNING!: Dates are already booked in ' + sheetName + '. Deleting newly added event.');
// delete newly added date
currentSheet.deleteRow(cell.getRow());
}
});
}
我正在制作一个电子表格,它可以帮助我们自动安排会议。我想确保我的团队不会将会议安排在同一日期和时间。如何将其添加到我现有的可用代码中? (我在任何地方都找不到这个答案!!)
function addEvents(){
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
var cal = CalendarApp.getCalendarById("c_kdaqhj8lkd7u68s8thinbnjpik@group.calendar.google.com");
var data = ss.getRange("A2:F"+ lr).getValues();
for(var i = 0;i<data.length;i++){
if(cal.getEvents(data[i][1], data[i][2])==null || cal.getEvents(data[i][1], data[i][2]).length==0 ){
cal.createEvent(data[i][0], data[i][1], data[i][2],{guests: ''+data[i][3]+','+data[i][4]+'', description:data[i][5]});
}
} }
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Sync to Calendar')
.addItem('Schedule events now', 'addEvents')
.addToUi()
}
谢谢!
我的回答与 Cooper 提供的类似,所以我将发布此内容以帮助您 sheet 正确维护。
我在 onEdit()
期间添加了一个行为,当用户在 sheet 中添加一组现有的开始和结束日期时,最近的 added/edited 行会自动删除。
这可以减少对日历的调用次数,但代价是在编辑期间不断检查 sheets。
欢迎使用下面的代码
function onEdit(e) {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var currentSheet = SpreadsheetApp.getActiveSheet();
var cell = currentSheet.getActiveCell();
var cellValue = cell.getValue();
var date, dates, occurences, limit;
// newly added date in active sheet
if (cell.getColumn() == 2) {
date = [cellValue, cell.offset(0, 1).getValue()];
}
else if (cell.getColumn() == 3) {
date = [cell.offset(0, -1).getValue(), cellValue];
}
// traverse other sheets
sheets.forEach(function(sheet){
var sheetName = sheet.getName();
// dates from other sheets
dates = sheet.getRange(2, 2, sheet.getLastRow(), 2).getValues();
occurences = 0;
// check if dates in other sheets have the newly added date
for(var index in dates){
if(JSON.stringify(dates[index]) === JSON.stringify(date)) {
// increment if found
occurences++;
}
}
if(sheet.getName() != currentSheet.getName()) {
// should not occur in other sheets
limit = 0;
}
else {
// should occur at most once in the active sheet
limit = 1;
}
// if date was found more than the limit
if (occurences > limit) {
// prompt user that the newly added date is present in other sheets
SpreadsheetApp.getUi().alert('WARNING!: Dates are already booked in ' + sheetName + '. Deleting newly added event.');
// delete newly added date
currentSheet.deleteRow(cell.getRow());
}
});
}