表单提交处理程序创建重复的Google日历事件

时间:2017-08-22 08:19:44

标签: google-apps-script google-sheets

我修改了this question的代码以满足我的需求。我使用填写Google表格的Google表单,然后该脚本会在Google日历中插入一个事件。我已经安装了一个“表单提交”触发器来执行脚本。我遇到的问题是我的代码从工作表第一行的数据开始,每次添加新的表单响应时都添加相同的事件。

这是我的版本:

//push new events to calendar
function pushToCalendar() {
  //spreadsheet variables
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow(); 
  var range = sheet.getRange(2,1,lastRow,16);
  var values = range.getValues(); 

  //calendar variables
  var defaultCalendar = CalendarApp.getDefaultCalendar()

  var numValues = 0;
  for (var i = 0; i < values.length; i++) {     
    //check to see if Start DateTime and End DateTime are filled out
    if ((values[i][3]) && (values[i][4])) {
      //check if it's been entered before  
      if (values[i][6] != 'y') {
        //create event https://developers.google.com/apps-script/class_calendarapp#createEvent
        var newEventTitle = values[i][1] + ' - ' + values[i][2];
        var startDay = Utilities.formatDate(new Date(values[i][3]), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
        var endDay = Utilities.formatDate(new Date(values[i][4]), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
        var newEvent = defaultCalendar.createEvent(newEventTitle, new Date(startDay), new Date(endDay), {location: values[i][2]});
        //get ID
        var newEventId = newEvent.getId();

        //mark as entered, enter ID
        sheet.getRange(i + 2, 6).setValue('y');
        sheet.getRange(i + 2, 7).setValue(newEventId);
      }  
    }

    numValues++;
  }
}

2 个答案:

答案 0 :(得分:1)

自己找到解决方案:在第20行我改变了代码

if (values[i][6] != 'y') { 

if (!values[i][6]) {

无需写出'y'符号。我也改变了

sheet.getRange(i+2,6).setValue('y');

要     sheet.getRange第(i + 2,6).setValue(&#39;&#39);

不再重复了。代码完美无缺!

答案 1 :(得分:0)

原始代码的问题是您读取的列错误-JavaScript数组的基数为0,而电子表格的列数为1。第6列(来自getRange(i + 2, 6)位于数组索引5中,即values[i][5],而不是values[i][6]。因此,您将newEventId与字符串{{1 }},这永远不会一样。

如您的解决方案所示,删除以下条件:'y'(又名第7列,脚本在其中写入创建的事件的ID)不等于values[i][6](条件始终为true),并且相反,测试任何值将适当地保护事件创建代码。考虑到事件ID列的存在,完全不需要写入'y'的列。

如果您从表单响应表中删除该列,则代码保护将为:

'y'