首页 > 解决方案 > 将多个事件插入谷歌日历

问题描述

我需要一次将 120 个事件从用户插入到 google calander 我有 React 应用程序,并从中在 120 个不同日期创建相同提醒的 120 个副本。

我想将它们添加到压延机中并使用import { gapi } from 'gapi-script'

我尝试像这样单独发送事件:

var event = {
            'summary':  nameValue.toString(),
            'description': ReminderTextValues.toString(),
            'start': {
              'date': ISODateString(javasScriptDate)
            },
            'end': {
              'date': ISODateString(NextDate)
            },
            'reminders': {
              'useDefault': false,
              'overrides': [
                {'method': "email", 'minutes': 24 * 60},
                {'method': "popup", 'minutes': 30}
              ]
            }
          }


         var request = gapi.client.calendar.events.insert({
            'calendarId': 'primary',
            'resource': event,
          })

          request.execute(event => {
            console.log("Executed:", event)
          })

即使我从 120 事件中只有 100 个返回403(这是一个不同的问题)在日历中,我也看到实际上只有 1 个被添加。

我也尝试这样使用batch

// we will submit all the request in a 1 batch
        var batch = gapi.client.newBatch();

        // We will save the eevnt for the next 120 years
        for (var startYear = HebrewDateEnteredByTheUser.year; startYear< (HebrewDateEnteredByTheUser.year+120); startYear++ )
        {

          // JS date 
          const javasScriptDate = new Date(day, month, startYear).addHours(1);
          const NextDate = javasScriptDate.addHours(22);

          // Google event
          var event = {
            'summary':  nameValue.toString(),
            'description': ReminderTextValues.toString(),
            'start': {
              'date': ISODateString(javasScriptDate)
            },
            'end': {
              'date': ISODateString(NextDate)
            },
            'reminders': {
              'useDefault': false,
              'overrides': [
                {'method': "email", 'minutes': 24 * 60},
                {'method': "popup", 'minutes': 30}
              ]
            }
          }

          batch.add(gapi.client.calendar.events.insert({
            'calendarId': 'primary',
            'resource': event,
          }));

然后在循环运行后:

batch.then(function(){
          console.log('all jobs done!!!')
        });

在此之后我没有收到任何错误,并且在我看到的领事馆中,all jobs done!!!但是当我检查日历时,我只能找到前 5 个事件,其余的都被忽略了......

如何一次将 120 个事件插入谷歌日历?

标签: reactjsgoogle-calendar-apigoogle-api-js-client

解决方案


您的症状与“超出 403 速率限制”错误一致。您将需要限制您的请求。前 20 个通常是可以的,但之后您需要将速度减慢到大约每 1.5 秒一个请求。不要使用 Batch,因为 a) 它已被弃用,b) 它使问题变得更糟。

我使用的方法是将所有请求放在内存队列(我使用数组)上,然后有一个单独的例程,它以每 x 秒一个的速率将项目出列。任何失败都会简单地留在队列中并重试。我的算法有点启发式,因为它逐渐提高速度直到达到 304,然后减慢到 2 秒的间隔。


推荐阅读