Сценарий приложения getEventById () возвращает ноль - PullRequest
0 голосов
/ 02 марта 2020

Я новичок в скрипте приложений и борюсь с функцией "getEventById ()". Моя цель - удалить запись о событии в Календаре Google с помощью Google Sheets, когда вы нажимаете кнопку. Мне уже удалось получить идентификатор события через Apps Script и это Google API V3, но когда я передаю его как «getEventById» в качестве параметра, он возвращает ноль, даже когда я «жестко кодирую» идентификатор.

Вот мой код. Я удалил некоторые части, так как они не важны, я думаю:

function calDate(){

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();

  var calId = spreadsheet.getRange("N1").getValue();
  var calEvent = CalendarApp.getCalendarById(calId);
  var ui = SpreadsheetApp.getUi();


  var selection = spreadsheet.getSelection();
  var selectedRow = selection.getActiveRange().getA1Notation();

  var rowRange = sheet.getRange(selectedRow);
  var rowNumber = rowRange.getRow();

  var colRange = sheet.getRange(selectedRow);
  var colNumber = colRange.getColumn();

  if (colNumber !== 15){
    //wait for showtime
  }
  else{
    // its showtime

    var combinedRange = "O" + rowNumber;

    var sheetData = sheet.getRange(rowNumber, 3, 1, 15).getValues();

    if(sheetData[0][12] == false){

      var dateStart = new Date(sheetData[0][7]);
      var dateEnd = new Date(sheetData[0][8]);
      var KdName = sheetData[0][0];
      var BV = event_id[0][4];
      var combinedNames = KdName + " - " + BV;


      var items = Calendar.Events.list(calId, {
        timeMin: dateStart.toISOString(),
        timeMax: dateEnd.toISOString(),
        q: combinedNames
      }).items;

    }
    else{
      var testVar = calEvent.getEventById(/*This is where I would put the htmlLink (the event-id)*/);
    console.log(testVar);
    }

    }
  }

Надеюсь, этой информации достаточно, и если нет, не стесняйтесь просить больше. Я очень надеюсь, что вы, ребята, сможете мне помочь!

С уважением

РЕДАКТИРОВАТЬ И РЕШЕНИЕ

Хорошо, ребята, спасибо Матео Рэндвольфу, который любезно открыл вопрос в Google об этом, я смог разобраться. Это ссылка с примером того, как получить идентификатор события и передать этот идентификатор функции getEventById (). Или вот как кодовый блок:

    function findEventID() {
      var now = new Date();
      var nextEvent = new Date(now.getTime() + (2 * 60 * 60 * 1000));
      var event = CalendarApp.getDefaultCalendar().getEvents(now, nextEvent);
      ID = event[0].getId();

      Logger.log('EventID: ' + event[0].getId());
      Logger.log(CalendarApp.getDefaultCalendar().getEventById(ID));
   }

Теперь это смешно. Эта строка:

Logger.log('EventID: ' + event[0].getId());

возвращает идентификатор события, как и должно быть.

Но этот:

Logger.log(CalendarApp.getDefaultCalendar().getEventById(ID));

не показывает ничего, кроме "{}" , что странно. Но если вы примените «deleteEvent ()» к нему, вот так:

calEvent.getEventById(ID).deleteEvent(); //calEvent is a CalendarApp, see above

Это фактически удаляет событие из календаря! При этом я бы сказал, что мы нашли решение или хотя бы обходной путь.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

выпуск

Привет! Поэтому мне кажется, что в getEventById() есть ошибка, которая возвращает null вместо объекта события, поскольку я получал то же поведение, о котором вы сообщали в этом вопросе. Я отправил это поведение в систему отслеживания проблем publi c, вы можете найти его здесь со всеми обсуждениями этого поведения.

Надеюсь, это помогло вам. Дайте мне знать, если вам нужно что-то еще или вы что-то не поняли. :)

0 голосов
/ 02 марта 2020

Использование поискового запроса API календаря для поиска событий в календаре

function calDate(){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sh=ss.getActiveSheet();
  var calId=ss.getRange("N1").getValue();
  var calEvent=CalendarApp.getCalendarById(calId);
  var row=ss.getActiveRange().getRow();
  var col=ss.getActiveRange().getColumn()
  if (col!=15){
    //wait for showtime
  }else{
    var vs=sh.getRange(row, 3, 1, 15).getValues();
    if(vs[0][12] == false){
      var dateStart=new Date(vs[0][7]);//col J
      var dateEnd=new Date(vs[0][8]);//col K
      var KdName=vs[0][0];//col 3

нижеприведенный идентификатор события не определен

      var BV=event_id[0][4];//col G
      var combinedNames=KdName + " - " + BV;
      var items=Calendar.Events.list(calId, {timeMin: dateStart.toISOString(),timeMax: dateEnd.toISOString(),q: combinedNames}).items;
    }
    else{
      var testVar=calEvent.getEventById(/*This is where I would put the htmlLink (the event-id)*/);
      console.log(testVar);
    }
  }
}

Поскольку вы не могли поделиться своей таблицей, я делюсь своей с примером

Одна вещь, которая очень помогает, - это играть с проводником API, чтобы понять, что работает, а что нет. Если вы хотите отобразить все поля, вы можете использовать * и , этот пример также оказался очень полезным

Вот код:

function myOwnEventSearch() {
  var calendarId='***********calendar id**************';
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet235');
  var sr=2;
  var sc=2
  var rg=sh.getRange(sr,sc,sh.getLastRow()-sr+1,sh.getLastColumn()-sc+1);
  var vA=rg.getValues();
  var hA=sh.getRange(sr-1,sc,1,sh.getLastColumn()-sc+1).getValues()[0];
  var idx={};//locates the data index from column header names
  hA.forEach(function(h,i){idx[h]=i;});
  var cal=CalendarApp.getCalendarById(calendarId);
  var html='<style>td,th{}</style><table><tr><th>Summary</th><th>Start</th><th>End</th><th>Id</th></tr>'
  for(var i=0;i<vA.length;i++) {
    if(!vA[i][idx['Id']] && vA[i][idx['DateFrom']] && vA[i][idx['DateTo']] && vA[i][idx['SearchString']]) {
      var request={timeMin:new Date(vA[i][idx["DateFrom"]]).toISOString(),timeMax:new Date(vA[i][idx["DateTo"]]).toISOString(),q:vA[i][idx["SearchString"]],showDeleted: false,singleEvents:true,maxResults:10,orderBy:"startTime"};
      var resp=Calendar.Events.list(calendarId, request);
      if(resp.items.length>0) {
        var idA=[];
        resp.items.forEach(function(item,j){
          html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>', item.summary,item.start,item.end,item.id);
          idA.push(item.id);
        });
        sh.getRange(i+sr,idx['Id']+sc).setValue(idA.join(', '))
      }
    }
  }
  html+='<table>';
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html).setWidth(800), "My Events")
}

Вот электронная таблица перед запуском скрипта.

Spreadsheet before the script runs

Вот диалоговое окно, в котором отображаются результаты поиска.

The Search Results

Вот как выглядит электронная таблица после запуска сценария:

The Event Ids were copied into the Id column

Идентификаторы событий были скопированы в столбец идентификаторов

И это были четыре события, которые я создал в своем календаре ::

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...