google-apps-script - 谷歌表自动填充谷歌日历
问题描述
我正在尝试从特定的谷歌表格中获取数据以在谷歌日历中创建事件。请参阅电子表格。
https://docs.google.com/spreadsheets/d/1eBEStiTKXI0YPXfQBYzqXjwwv4kZ21033TdtysxdhHI/edit?usp=sharing
基本上,当有人勾选方框时,它会在美国东部标准时间 10:00:00 的日期 (Col B) 为该人(第 2 行)创建一个事件。例如,当有人勾选单元格 P14 中的框时,它会创建一个事件:
名称 - Lily Ahadi - PC 活动日期 - 2020 年 3 月 16 日 活动时间:10:00:00
这是我部分工作的代码,然后让其他人帮忙,我们都没有得到任何地方。我即将放弃,但我想我会与 stackflow 专家进行最后一次尝试。该代码在工作表的脚本编辑器中可用。
function onEdit(e) {
try {
var range = e.range;
Browser.msgBox(range);
var nameSheet = e.source.getSheetName();
var rowID = range.rowStart;
var colID = range.columnStart;
var res = e;
var oldValue = res.oldValue;
var newValue = res.value;
var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameSheet);
if (oldValue == "FALSE" && newValue == "TRUE" && nameSheet == "Master Client List"){
var category = data.getRange(3, colID).getValue();
var date = data.getRange(rowID, 2).getValue();
date = getYesterdaysDate(date)
var timeDiff = 60;
var startTime = "10:00:00";
if (category == "PC"){
var name = data.getRange(2, colID - 1).getValue();
Browser.msgBox(name+'-'+category + date);
}else{
var name = data.getRange(2, colID - 2).getValue();
}
// var startDateTime = date+' '+startTime+':00';
var startDateTime = testMoment1(date, startTime);
var endDateTime = addMins(startDateTime, timeDiff);
var event = CalendarApp.getDefaultCalendar().createEvent(name+'-'+category,
new Date(startDateTime),
new Date(endDateTime),
{description: ''});
Logger.log('Event ID: ' + event.getId());
}
}
catch(err) {
SpreadsheetApp.getUi().alert(err);
}
}
function testMoment(date, time) {
eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js').getContentText());
var date = moment(date).format('YYYY/MM/DD');
// var time = time;
// Logger.log(moment(date).format('MM/DD/YYYY'));
// tell moment how to parse the input string
var momentObj = moment(date + time, 'YYYY-MM-DDLT');
// conversion
var dateTime = momentObj.format('YYYY-MM-DDTHH:mm:ss');
return dateTime;
}
function testMoment1(date, time) {
eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js').getContentText());
// var date = moment(date).format('YYYY/MM/DD');
// var time = time;
// Logger.log(moment(date).format('MM/DD/YYYY'));
var c = new Date();
var n = c.getFullYear();
// tell moment how to parse the input string
var momentObj = moment(date + time, 'YYYY-MM-DDLT').set('year', n).add(0, 'days');
// conversion
var dateTime = momentObj.format('YYYY-MM-DDTHH:mm:ss');
// dateTime = moment(dateTime, "YYYY-MM-DDTHH:mm:ss");
return dateTime;
}
function addMins(dateTime, durationInMinutes){
eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js').getContentText());
var startTime = dateTime;
// var durationInMinutes = '120';
var endTime = moment(startTime, 'YYYY-MM-DDTHH:mm:ss').add(durationInMinutes, 'minutes').format('YYYY-MM-DDTHH:mm:ss');
return endTime;
}
function getYesterdaysDate(date1) {
var date = new Date(date1);
date.setDate(date.getDate());
var day = date.getDate();
var month = (date.getMonth()+1);
var year = date.getFullYear();
month = month < 10 ? '0'+month : month;
day = day < 10 ? '0'+day : day;
// Logger.log(date.getFullYear() + '-' + (date.getMonth()+1) + '-' + date.getDate());
return year + '/' + month + '/' + day;
}
function myFunction() {
var data=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Master Client List');
// var s=ss.getActiveSheet();
var c=data.getLastColumn();
for (var i = 3; i <= c; i++) {
if (i%3 === 0){
var name = data.getRange(2, i).getValue();
var dob = data.getRange(1, i).getValue();
var timeDiff = 60;
var startTime = "10:00:00";
Logger.log(name);
Logger.log(name);
Logger.log(startTime);
//birthdayevent(name, dob, startTime, timeDiff)
Logger.log(name);
// break;
}
}
}
解决方案
Your code has two main issues:
1. You are querying for if (oldValue == "FALSE")
If you implement into your code the line Logger.log(oldValue);
you will realize that an empty checkbox will return you the value "false"
and not "FALSE"
. You need to modfy your if
condition accordingly.
2. You are trying to use UrlFetchApp
on simple onEdit
trigger
As specified under restrictions for simple triggers:
They cannot access services that require authorization.
This problem can be easily solved by transforming your trigger into an installable one. For this:
- Rename your function
onEdit()
to something different - Bind to the funciton an installable
onEdit
trigger as described here
After you implement those two modifications your code will run and create an event when you check a checkbox.
Now, I am not familiar enough to judge either the event parameters (data, event title) are retrieved as you desire. For troubleshooting I recommend you to log all variables - this will help you to spot any error quickly.
推荐阅读
- ios - 重新加载tableview时如何处理闪烁和空白问题?
- ios - Google 广告未在特定应用中展示
- elixir - elixir 不使用 enum.each 更新 mapset 中的值
- python-3.x - 将 Pandas 绘制成子图
- keycloak - Keycloak:限制领域中的最大用户数
- python - 在 Python3 中执行链式 bash 命令,包括多个管道和 grep
- matrix - 如何摆脱在 SageMath 中调用文本文件的错误消息
- c++ - 如果没有所有权,Boost::thread::mutex 可以解锁互斥锁吗?
- android - android.widget.Editor 崩溃。android.content.res.Resources$NotFoundException
- python - 使用列表中的变量或项目作为代码的一部分(而不是字符串或变量)或变量本身?