Google日历上有年龄的生日

多年以来,我一直在使用Google日历。 在出生,周年纪念日或其他重大事件发生时,为什么不显示Google通讯录中的人的年龄,这总是让人难以理解。



当我开始有目的地搜索该问题的答案时,我发现Google要求在日历中显示年龄请求非常受欢迎,并且仍然没有明确的答案。 它鼓励我基于Google Apps脚本创建解决方案。


为什么使用Google脚本?


我不想使用任何第三方平台或服务,因为我的所有联系人都在Google通讯录中。 我也不想使用会收集我的任何个人数据以用于难以理解目的的应用程序或加载项。 需要一个透明的工作结构。


代码在哪里?


我不能说脚本是从头开始编写的-我利用了Bryan Patterson开发成果,该成果在6年前的2014年发布。


结果如下:


带有日历的生日和纪念日。gs
//   var contactsCal; var defaultCal; var now; var fromDate; var toDate; var events; //  (function() { contactsCal = CalendarApp.getCalendarById('addressbook#contacts@group.v.calendar.google.com'); defaultCal = CalendarApp.getDefaultCalendar(); //       // var defaultCal = CalendarApp.getCalendarById('regrncqXXXXXXp07eihepag74@group.calendar.google.com'); //   now = new Date(); fromDate = new Date(now.getTime()); toDate = new Date(now.getTime() + 31 * (1000 * 60 * 60 * 24)); // + 31     Logger.log(' : ' + Utilities.formatDate(fromDate, 'Asia/Yekaterinburg', 'MMMM dd, yyyy HH:mm:ss Z')); Logger.log(' : ' + Utilities.formatDate(toDate, 'Asia/Yekaterinburg', 'MMMM dd, yyyy HH:mm:ss Z')); events = contactsCal.getEvents(fromDate, toDate); Logger.log(' : ' + events.length); })(); function birthdayAgeToCalendar() { //  for (var i in events) { Logger.log('birthdayAgeToCalendar.  . : ' + events[i].getTitle()); var name = events[i].getTitle().split(" –  ")[0]; var contacts = ContactsApp.getContactsByName(name); Logger.log('birthdayAgeToCalendar.  . Name: ' + name); for (var c in contacts) { var bday = contacts[c].getDates(ContactsApp.Field.BIRTHDAY); var bdayMonthName, bdayYear, bdayDate; try { bdayMonthName = bday[0].getMonth(); bdayYear = bday[0].getYear(); bdayDate = new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + bdayYear); Logger.log('birthdayAgeToCalendar. bdayDate: ' + bdayDate); } catch (error) {} var years = parseInt(new Date().getFullYear()) - bdayYear; try { defaultCal.createAllDayEvent(name + " –  , " + years + "  ()", new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + new Date().getFullYear())); Logger.log(": " + name + " –  , " + years + "  ()"); } catch (error) {} } } } function anniversaryAgeToCalendar() { // for (var i in events) { Logger.log('anniversaryAgeToCalendar. . : ' + events[i].getTitle()); var name = events[i].getTitle().split("   ")[1]; var contacts = ContactsApp.getContactsByName(name); Logger.log('anniversaryAgeToCalendar. . Name: ' + name); for (var c in contacts) { var bday = contacts[c].getDates(ContactsApp.Field.ANNIVERSARY); //   https://developers.google.com/apps-script/reference/contacts/field var bdayMonthName, bdayYear, bdayDate; try { bdayMonthName = bday[0].getMonth(); bdayYear = bday[0].getYear(); bdayDate = new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + bdayYear); Logger.log('anniversaryAgeToCalendar. bdayDate: ' + bdayDate); } catch (error) {} var years = parseInt(new Date().getFullYear()) - bdayYear; try { defaultCal.createAllDayEvent("   " + name + ", " + years + "  ()", new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + new Date().getFullYear())); Logger.log(": " + "   " + name + ", " + years + "  ()"); } catch (error) {} } } } function TriggersCreateTimeDriven() { //      // Deletes all triggers in the current project. var triggers = ScriptApp.getProjectTriggers(); for (var i = 0; i < triggers.length; i++) { ScriptApp.deleteTrigger(triggers[i]); } //    ScriptApp.newTrigger("birthdayAgeToCalendar") //  .timeBased() .onMonthDay(1) //  .atHour(1) .create(); ScriptApp.newTrigger("anniversaryAgeToCalendar") // .timeBased() .onMonthDay(1) .atHour(2) .create(); } 

使用方法


1.在Google云端硬盘上创建新的Google Apps脚本:



2.复制脚本代码。


3.测试运行“ birthdayAgeToCalendar”功能-该脚本将在默认日历中创建事件,以指示在31天内(但今年)有生日的人的年龄:



4.请参阅查看/日志:



5.检查日历:



6.如果一切正常,请运行“ TriggersCreateTimeDriven”功能-它将提前一个月的第一天自动创建“ birthdayAgeToCalendar”和“ anniversaryAgeToCalendar”功能的自动启动。


总结


我相信发生重大事件时在Google日历中显示年龄的问题已解决。 我还要感谢Yevgeny Namokonov( 电报频道“ Google Sheets” )和Alexander Ivanov,以及他的电报频道,为我们分开和编辑书面代码提供了帮助。


可以在GitHub上找到更多详细信息。


发表者: Mikhail Shardin
十二月25,2019

Source: https://habr.com/ru/post/zh-CN481858/


All Articles