无法从Google日历中读取记录为服务帐户的用户条目

时间:2019-01-24 08:35:58

标签: c# google-calendar-api

我的应用程序非常有效地基于Servivce帐户身份验证。可以读取,删除条目或将条目插入Google日历。所有条目都可以在日历网站上看到,并且可以通过应用程序进行管理,也可以在网站上手动进行管理。

但是,如果我将新事件手动插入网站的日历中,则该应用程序事件不可见。根本无法以编程方式管理它们。日历当然是与Google服务帐户共享的-在“日历”->“设置”->“共享:编辑设置”中添加了服务帐户的电子邮件地址。

使用OAuth 2.0的同一应用程序可以很好地与手动和以编程方式添加的条目一起使用。

我的问题是使用基于服务帐户的应用程序管理所有用户的所有条目。谁能对此有类似的问题和解决方案?

string []范围=新的string [] {                 CalendarService.Scope.Calendar};

        var certificate = new X509Certificate2(@"My Project-xxxxxxxxx.p12", "notasecret", X509KeyStorageFlags.Exportable);

        ServiceAccountCredential credentials = new ServiceAccountCredential(
             new ServiceAccountCredential.Initializer("XXXX@XXX-XXXX.iam.gserviceaccount.com")
             {
                 Scopes = scopes                                          
             }.FromCertificate(certificate));

        var service = new CalendarService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credentials,
            ApplicationName = ApplicationName,
        });
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        // Define parameters of request.
        EventsResource.ListRequest request = service.Events.List("primary");
        request.TimeMin = DateTime.Now;
        request.ShowDeleted = false;
        request.SingleEvents = true;
        request.MaxResults = 10;
        request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;

        // List events.
        Events events = request.Execute();
        Console.WriteLine("Upcoming events:");
        if (events.Items != null && events.Items.Count > 0)
        {
            foreach (var eventItem in events.Items)
            {
                string when = eventItem.Start.DateTime.ToString();
                if (String.IsNullOrEmpty(when))
                {
                    when = eventItem.Start.Date;
                }
                //Console.WriteLine("{0} {1} {2} {3} ({4})", eventItem.Status, eventItem.Summary, eventItem.Location, eventItem.Description, when);
                Console.WriteLine(" Id: {0} Start: {1} End: {2} Status: {3} Summary: {4} Location: {5} description: {6} HtmlLink: {7}",
                    eventItem.Id + '\n',
                    eventItem.Start.DateTime.ToString() + '\n',
                    eventItem.End.DateTime.ToString() + '\n',
                    eventItem.Status + '\n',
                    eventItem.Summary + '\n',
                    eventItem.Location + '\n',
                    eventItem.Description + '\n',
                    eventItem.HtmlLink);
            }
        }
        else
        {
            Console.WriteLine("No upcoming events found.");
        }

通过这种方式,我可以检查日历列表:

 var calendars = service.CalendarList.List().Execute().Items;
            foreach (CalendarListEntry entry in calendars)
                Console.WriteLine(entry.Summary + " - " + entry.Id);

只有一个。

例如,“日历”网站上有5个活动,同一天,如果应用程序是从应用程序创建的,则应用程序仅列出3个事件,而直接在网络上手动创建的2个事件未列出。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我没有使用“主要”作为主要日历ID,而是使用了服务列出的日历标识符。这解决了我的问题。