【发布时间】:2012-09-18 03:06:33
【问题描述】:
我正在为我的工作场所创建一个 Google Apps 电子表格名册。实际的花名册相当简单,只需进行一些计算和一个 onEdit 脚本即可更改单元格颜色,具体取决于该小时的职责。
这个新花名册的一个主要部分是能够为每个人创建 Google 日历活动,以通知他们轮班。名册已创建,事件应每月创建。在月初,负责花名册的工作人员将运行一个函数,并为每个人创建该月的所有事件。 (我希望这是有道理的......)
我的代码如下所示。名为“Splash”的工作表(工作表索引 0)包含团队中每个员工的姓名和电子邮件。名册将在工作表索引 1 到无穷大上创建。
在名册表本身上,A 列包含每个员工的姓名。 B 列包含开始时间,C 列包含结束时间。
function sendInvites() {
// Gather Prelim Information
var splash = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Splash");
var nameRange = splash.getRange("A6:B9"); // Need to change this to be the full staff list in Splash
var inviteSheet = Browser.inputBox("Sheet to send invites from (Number)", Browser.Buttons.OK_CANCEL)
var days = SpreadsheetApp.getActiveSpreadsheet().getSheets()[inviteSheet];
var dayRange;
//Initiate iteration through Names, according to the Splash sheet
for(nameRow=nameRange.getRow(); nameRow<=9; nameRow++){ //Change to Corresponding iterate
// Gather Name and Email information for the each person
var col = nameRange.getColumn();
var row = nameRow;
var name = splash.getRange(row, col).getValue();
var email = splash.getRange(row, col+1).getValue();
var cal = CalendarApp.getCalendarById(email);
//Initiate iteration through Days, according to the Roster
for(i=0; i<=6; i++){
//Specify Day Ranges
switch(i){
case 0: //Saturday
dayRange = days.getRange("A1:O6"); break;
case 1: //Sunday
dayRange = days.getRange("A10:O15"); break;
case 2: //Monday
dayRange = days.getRange("A19:O41"); break;
case 3: //Tuesday
dayRange = days.getRange("A45:O67"); break;
case 4: //Wednesday
dayRange = days.getRange("A71:O93"); break;
case 5: //Thursday
dayRange = days.getRange("A97:O119"); break;
case 6: //Friday
dayRange = days.getRange("A123:O145"); break;
}
//Find Name in dayRange
for(dayRow=dayRange.getRow(); dayRow<=dayRange.getLastRow(); dayRow++){
var searchCol = dayRange.getColumn();
var searchRow = dayRow;
var searchName = days.getRange(searchRow, searchCol).getValue();
if (name==searchName){
// Gather and format Date and Time information for invitation
var eventName = "Phones";
var date = Utilities.formatDate(dayRange.getValue(), "GMT+1000", "EEE MMM dd yyyy");
var startCell = days.getRange(searchRow, searchCol+1).getValue();
var endCell = days.getRange(searchRow, searchCol+2).getValue();
if (startCell != ""){
var startTime = date + " " + Utilities.formatDate(startCell, "GMT+1000", "HH:mm:ss");
var endTime = date + " " + Utilities.formatDate(endCell, "GMT+1000", "HH:mm:ss");
//Create a calendar event with the details above
Utilities.sleep(500); //Pause event creation for half second, to allow the last event to be fully created (Avoids "Calendar: Mismatch: etags error")
cal.createEvent(eventName, new Date(startTime), new Date(endTime)).removeAllReminders();
}
continue;
}
}
}
}
}
我现在遇到的问题是逻辑有效,但并非所有事件都在创建。我正在与包括我自己在内的四名员工进行测试。它只会在抛出 Calendar: Mismatch: etags 错误之前完成 Names 的一个半迭代。
我知道在一次更改日历两次时会发生此错误。我在事件创建之前添加了半秒的睡眠时间,以允许这样做。现在已经很少见了,但仍在发生。我试过让它睡 2 秒,我试过把它移到不同的地方。所有这一切仍将导致 eTags 错误。
不太确定从这里去哪里。我觉得名册差不多可以使用了,但还不够稳定。
如果您有任何想法或需要澄清,请告诉我。
【问题讨论】:
-
尝试问题 264 code.google.com/p/google-apps-script-issues/issues/…中建议的最新解决方法
-
哇,我觉得自己像个白痴。我一直在跟踪第 264 期,但没有看到那个帖子。非常感谢!!
标签: google-apps-script google-calendar-api google-sheets