【问题标题】:Google sheet to auto- populate google calendar谷歌表自动填充谷歌日历
【发布时间】:2020-09-03 12:22:23
【问题描述】:

我正在尝试从特定的谷歌表格中获取数据以在谷歌日历中创建事件。请参阅电子表格。

https://docs.google.com/spreadsheets/d/1eBEStiTKXI0YPXfQBYzqXjwwv4kZ21033TdtysxdhHI/edit?usp=sharing

基本上,当有人勾选方框时,它会在美国东部标准时间 10:00:00 的日期 (Col B) 为该人(第 2 行)创建一个事件。例如,当有人勾选单元格 P14 中的框时,它会创建一个事件:

名称 - 莉莉·阿哈迪 - 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;
    }
  }
}   

【问题讨论】:

  • 您能具体说明代码中的哪些问题吗?您收到任何错误吗?脚本是否捕获了错误的数据?还是根本没有触发器?

标签: google-apps-script google-sheets google-calendar-api


【解决方案1】:

您的代码有两个主要问题:

1.您正在查询if (oldValue == "FALSE")

如果您在代码中实现Logger.log(oldValue); 行,您将意识到空复选框将返回值"false" 而不是"FALSE"。您需要相应地修改您的if 条件。

2。您正在尝试在简单的onEdit 触发器上使用UrlFetchApp

如restrictions 中指定的简单触发器:

他们无法访问需要授权的服务。

通过将触发器转换为可安装的触发器,可以轻松解决此问题。 为此:

  • 将您的函数 onEdit() 重命名为不同的名称
  • 将可安装的onEdit 触发器绑定到函数,如here 所述

实现这两个修改后,您的代码将运行并在您选中复选框时创建一个事件。

现在,我还不够熟悉,无法判断是否按您的意愿检索事件参数(数据、事件标题)。对于故障排除,我建议您记录所有变量 - 这将帮助您快速发现任何错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2016-10-17
    • 2015-06-20
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多