إنشاء أحداث

تخيل تطبيقًا يساعد المستخدمين في العثور على أفضل مسارات المشي لمسافات طويلة. من خلال إضافة المشي لمسافة طويلة كحدث في التقويم، يستفيد المستخدمون من مساعدة كبيرة في منظمًا تلقائيًا. يساعدهم تقويم Google على مشاركة الخطة ويذكّرهم بذلك حتى يستعدوا بدون ضغوط. أيضًا، بفضل التكامل السلس لمنتجات Google، يرسل Google Now إشعارًا إليهم بشأن الوقت المغادرة وستوجههم خرائط Google إلى مكان الاجتماع في الوقت المحدد.

توضّح هذه المقالة كيفية إنشاء أحداث في التقويم وإضافتها إلى حسابات المستخدمين. التقاويم.

إضافة حدث

لإنشاء حدث، يمكنك طلب events.insert() التي يتم تقديمها في على الأقل هذه المعلمات:

  • calendarId هو معرِّف التقويم ويمكن أن يكون عنوان البريد الإلكتروني التقويم الذي يتم فيه إنشاء الحدث أو كلمة رئيسية خاصة 'primary' الذي سيستخدم التقويم الأساسي للمستخدم الذي سجّل الدخول. في حال حذف إذا كنت لا تعرف عنوان البريد الإلكتروني للتقويم الذي تريد استخدامه، يمكنه التحقّق من ذلك في إعدادات التقويم على تطبيق "تقويم Google" على الويب. واجهة المستخدم (في قسم "عنوان التقويم") أو يمكنك البحث عنه نتيجة مكالمة calendarList.list().
  • event هو الحدث الذي يتم إنشاؤه بكل التفاصيل اللازمة، مثل بدء وينتهي. الحقلان المطلوبان الوحيدان هما start وend. يمكنك الاطّلاع على مرجع واحد (event) للمجموعة الكاملة من الأحداث الحقول.

لإنشاء أحداث بنجاح، عليك إجراء ما يلي:

  • اضبط نطاق OAuth على https://www.googleapis.com/auth/calendar حتى أن يكون لديك حق التعديل في تقويم المستخدم.
  • يُرجى التأكد من أن المستخدم الذي تمت مصادقته يمتلك إذنًا بالكتابة في التقويم من خلال إضافة calendarId الذي قدّمته (على سبيل المثال من خلال الاتصال calendarList.get() calendarId ويتحقّق من accessRole).

إضافة البيانات الوصفية للحدث

يمكنك اختياريًا إضافة البيانات الوصفية للحدث عند إنشاء حدث في التقويم. إذا كنت اختَر عدم إضافة بيانات وصفية أثناء الإنشاء، يمكنك تعديل العديد من الحقول باستخدام events.update(); إلا أنّ بعض الحقول مثل معرّف الحدث، يمكن فقط أثناء عملية events.insert().

الموقع الجغرافي

تؤدي إضافة عنوان إلى حقل الموقع إلى تفعيل ميزات مثل

"وقت المغادرة" أو عرض خريطة بالاتجاهات

رقم تعريف الحدث

عند إنشاء حدث، يمكنك اختيار إنشاء رقم تعريف الحدث الخاص بك

يتوافق مع متطلبات التنسيق. يمكّنك هذا من الاحتفاظ بالكيانات في قاعدة البيانات المحلية بالتزامن مع الأحداث في "تقويم Google". وكذلك يمنع إنشاء حدث مكرر في حالة فشل العملية في مرحلة ما بعد تم تنفيذه بنجاح في الواجهة الخلفية للتقويم. إذا كانت الإجابة "لا" يتم توفير معرّف الحدث، ينشئ الخادم معرّفًا لك. الاطّلاع على رقم تعريف الحدث المرجع للحصول على المزيد من المعلومات.

الحضور

يظهر الحدث الذي تنشئه في جميع تقاويم Google الأساسية

الضيوف الذين أدرجتهم بمعرّف الحدث نفسه. في حال ضبط من sendNotifications إلى true في طلب الإدراج، سيتمكّن الحاضرون من أيضًا إشعارًا عبر البريد الإلكتروني للحدث. ويمكنك الاطلاع على الأحداث التي تتضمن العديد من الضيوف مزيد من المعلومات.

توضّح الأمثلة التالية إنشاء حدث وضبط بياناته الوصفية:

البدء

// Refer to the Go quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/go
// Change the scope to calendar.CalendarScope and delete any stored credentials.

event := &calendar.Event{
  Summary: "Google I/O 2015",
  Location: "800 Howard St., San Francisco, CA 94103",
  Description: "A chance to hear more about Google's developer products.",
  Start: &calendar.EventDateTime{
    DateTime: "2015-05-28T09:00:00-07:00",
    TimeZone: "America/Los_Angeles",
  },
  End: &calendar.EventDateTime{
    DateTime: "2015-05-28T17:00:00-07:00",
    TimeZone: "America/Los_Angeles",
  },
  Recurrence: []string{"RRULE:FREQ=DAILY;COUNT=2"},
  Attendees: []*calendar.EventAttendee{
    &calendar.EventAttendee{Email:"lpage@example.com"},
    &calendar.EventAttendee{Email:"sbrin@example.com"},
  },
}

calendarId := "primary"
event, err = srv.Events.Insert(calendarId, event).Do()
if err != nil {
  log.Fatalf("Unable to create event. %v\n", err)
}
fmt.Printf("Event created: %s\n", event.HtmlLink)

Java

// Refer to the Java quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/java
// Change the scope to CalendarScopes.CALENDAR and delete any stored
// credentials.

Event event = new Event()
    .setSummary("Google I/O 2015")
    .setLocation("800 Howard St., San Francisco, CA 94103")
    .setDescription("A chance to hear more about Google's developer products.");

DateTime startDateTime = new DateTime("2015-05-28T09:00:00-07:00");
EventDateTime start = new EventDateTime()
    .setDateTime(startDateTime)
    .setTimeZone("America/Los_Angeles");
event.setStart(start);

DateTime endDateTime = new DateTime("2015-05-28T17:00:00-07:00");
EventDateTime end = new EventDateTime()
    .setDateTime(endDateTime)
    .setTimeZone("America/Los_Angeles");
event.setEnd(end);

String[] recurrence = new String[] {"RRULE:FREQ=DAILY;COUNT=2"};
event.setRecurrence(Arrays.asList(recurrence));

EventAttendee[] attendees = new EventAttendee[] {
    new EventAttendee().setEmail("lpage@example.com"),
    new EventAttendee().setEmail("sbrin@example.com"),
};
event.setAttendees(Arrays.asList(attendees));

EventReminder[] reminderOverrides = new EventReminder[] {
    new EventReminder().setMethod("email").setMinutes(24 * 60),
    new EventReminder().setMethod("popup").setMinutes(10),
};
Event.Reminders reminders = new Event.Reminders()
    .setUseDefault(false)
    .setOverrides(Arrays.asList(reminderOverrides));
event.setReminders(reminders);

String calendarId = "primary";
event = service.events().insert(calendarId, event).execute();
System.out.printf("Event created: %s\n", event.getHtmlLink());

JavaScript

// Refer to the JavaScript quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/js
// Change the scope to 'https://www.googleapis.com/auth/calendar' and delete any
// stored credentials.

const event = {
  'summary': 'Google I/O 2015',
  'location': '800 Howard St., San Francisco, CA 94103',
  'description': 'A chance to hear more about Google\'s developer products.',
  'start': {
    'dateTime': '2015-05-28T09:00:00-07:00',
    'timeZone': 'America/Los_Angeles'
  },
  'end': {
    'dateTime': '2015-05-28T17:00:00-07:00',
    'timeZone': 'America/Los_Angeles'
  },
  'recurrence': [
    'RRULE:FREQ=DAILY;COUNT=2'
  ],
  'attendees': [
    {'email': 'lpage@example.com'},
    {'email': 'sbrin@example.com'}
  ],
  'reminders': {
    'useDefault': false,
    'overrides': [
      {'method': 'email', 'minutes': 24 * 60},
      {'method': 'popup', 'minutes': 10}
    ]
  }
};

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

request.execute(function(event) {
  appendPre('Event created: ' + event.htmlLink);
});

Node.js

// Refer to the Node.js quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/node
// Change the scope to 'https://www.googleapis.com/auth/calendar' and delete any
// stored credentials.

const event = {
  'summary': 'Google I/O 2015',
  'location': '800 Howard St., San Francisco, CA 94103',
  'description': 'A chance to hear more about Google\'s developer products.',
  'start': {
    'dateTime': '2015-05-28T09:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  },
  'end': {
    'dateTime': '2015-05-28T17:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  },
  'recurrence': [
    'RRULE:FREQ=DAILY;COUNT=2'
  ],
  'attendees': [
    {'email': 'lpage@example.com'},
    {'email': 'sbrin@example.com'},
  ],
  'reminders': {
    'useDefault': false,
    'overrides': [
      {'method': 'email', 'minutes': 24 * 60},
      {'method': 'popup', 'minutes': 10},
    ],
  },
};

calendar.events.insert({
  auth: auth,
  calendarId: 'primary',
  resource: event,
}, function(err, event) {
  if (err) {
    console.log('There was an error contacting the Calendar service: ' + err);
    return;
  }
  console.log('Event created: %s', event.htmlLink);
});

PHP

$event = new Google_Service_Calendar_Event(array(
  'summary' => 'Google I/O 2015',
  'location' => '800 Howard St., San Francisco, CA 94103',
  'description' => 'A chance to hear more about Google\'s developer products.',
  'start' => array(
    'dateTime' => '2015-05-28T09:00:00-07:00',
    'timeZone' => 'America/Los_Angeles',
  ),
  'end' => array(
    'dateTime' => '2015-05-28T17:00:00-07:00',
    'timeZone' => 'America/Los_Angeles',
  ),
  'recurrence' => array(
    'RRULE:FREQ=DAILY;COUNT=2'
  ),
  'attendees' => array(
    array('email' => 'lpage@example.com'),
    array('email' => 'sbrin@example.com'),
  ),
  'reminders' => array(
    'useDefault' => FALSE,
    'overrides' => array(
      array('method' => 'email', 'minutes' => 24 * 60),
      array('method' => 'popup', 'minutes' => 10),
    ),
  ),
));

$calendarId = 'primary';
$event = $service->events->insert($calendarId, $event);
printf('Event created: %s\n', $event->htmlLink);

Python

# Refer to the Python quickstart on how to setup the environment:
# https://developers.google.com/calendar/quickstart/python
# Change the scope to 'https://www.googleapis.com/auth/calendar' and delete any
# stored credentials.

event = {
  'summary': 'Google I/O 2015',
  'location': '800 Howard St., San Francisco, CA 94103',
  'description': 'A chance to hear more about Google\'s developer products.',
  'start': {
    'dateTime': '2015-05-28T09:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  },
  'end': {
    'dateTime': '2015-05-28T17:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  },
  'recurrence': [
    'RRULE:FREQ=DAILY;COUNT=2'
  ],
  'attendees': [
    {'email': 'lpage@example.com'},
    {'email': 'sbrin@example.com'},
  ],
  'reminders': {
    'useDefault': False,
    'overrides': [
      {'method': 'email', 'minutes': 24 * 60},
      {'method': 'popup', 'minutes': 10},
    ],
  },
}

event = service.events().insert(calendarId='primary', body=event).execute()
print 'Event created: %s' % (event.get('htmlLink'))

Ruby

event = Google::Apis::CalendarV3::Event.new(
  summary: 'Google I/O 2015',
  location: '800 Howard St., San Francisco, CA 94103',
  description: 'A chance to hear more about Google\'s developer products.',
  start: Google::Apis::CalendarV3::EventDateTime.new(
    date_time: '2015-05-28T09:00:00-07:00',
    time_zone: 'America/Los_Angeles'
  ),
  end: Google::Apis::CalendarV3::EventDateTime.new(
    date_time: '2015-05-28T17:00:00-07:00',
    time_zone: 'America/Los_Angeles'
  ),
  recurrence: [
    'RRULE:FREQ=DAILY;COUNT=2'
  ],
  attendees: [
    Google::Apis::CalendarV3::EventAttendee.new(
      email: 'lpage@example.com'
    ),
    Google::Apis::CalendarV3::EventAttendee.new(
      email: 'sbrin@example.com'
    )
  ],
  reminders: Google::Apis::CalendarV3::Event::Reminders.new(
    use_default: false,
    overrides: [
      Google::Apis::CalendarV3::EventReminder.new(
        reminder_method: 'email',
        minutes: 24 * 60
      ),
      Google::Apis::CalendarV3::EventReminder.new(
        reminder_method: 'popup',
        minutes: 10
      )
    ]
  )
)

result = client.insert_event('primary', event)
puts "Event created: #{result.html_link}"

إضافة مرفقات Drive إلى الأحداث

يمكنك إرفاق ملف Google Drive. مثل ملاحظات الاجتماع في "مستندات Google" أو الميزانيات في "جداول بيانات Google" أو "العروض التقديمية من Google" في "العروض التقديمية من Google" أو غير ذلك ملفات Google Drive ذات الصلة بأحداث التقويم. يمكنك إضافة المرفق عند إنشاء حدث يحتوي على events.insert() أو لاحقًا كجزء من تعديل، مثلاً مع events.patch()

الجزآن لإرفاق ملف Google Drive بحدث هما:

  1. احصل على عنوان URL للملف alternateLink وtitle وmimeType من مورد ملفات Drive API، عادةً باستخدام الطريقة files.get().
  2. إنشاء حدث أو تعديله باستخدام حقول attachments المحدَّدة في الطلب الأساسية والمعلمة supportsAttachments تم تعيينها على true.

يوضّح مثال الرمز التالي كيفية تعديل حدث حالي لإضافته. مرفق:

Java

public static void addAttachment(Calendar calendarService, Drive driveService, String calendarId,
    String eventId, String fileId) throws IOException {
  File file = driveService.files().get(fileId).execute();
  Event event = calendarService.events().get(calendarId, eventId).execute();

  List<EventAttachment> attachments = event.getAttachments();
  if (attachments == null) {
    attachments = new ArrayList<EventAttachment>();
  }
  attachments.add(new EventAttachment()
      .setFileUrl(file.getAlternateLink())
      .setMimeType(file.getMimeType())
      .setTitle(file.getTitle()));

  Event changes = new Event()
      .setAttachments(attachments);
  calendarService.events().patch(calendarId, eventId, changes)
      .setSupportsAttachments(true)
      .execute();
}

PHP

function addAttachment($calendarService, $driveService, $calendarId, $eventId, $fileId) {
  $file = $driveService->files->get($fileId);
  $event = $calendarService->events->get($calendarId, $eventId);
  $attachments = $event->attachments;

  $attachments[] = array(
    'fileUrl' => $file->alternateLink,
    'mimeType' => $file->mimeType,
    'title' => $file->title
  );
  $changes = new Google_Service_Calendar_Event(array(
    'attachments' => $attachments
  ));

  $calendarService->events->patch($calendarId, $eventId, $changes, array(
    'supportsAttachments' => TRUE
  ));
}

Python

def add_attachment(calendarService, driveService, calendarId, eventId, fileId):
    file = driveService.files().get(fileId=fileId).execute()
    event = calendarService.events().get(calendarId=calendarId,
                                         eventId=eventId).execute()

    attachments = event.get('attachments', [])
    attachments.append({
        'fileUrl': file['alternateLink'],
        'mimeType': file['mimeType'],
        'title': file['title']
    })

    changes = {
        'attachments': attachments
    }
    calendarService.events().patch(calendarId=calendarId, eventId=eventId,
                                   body=changes,
                                   supportsAttachments=True).execute()

إضافة مؤتمرات الفيديو والهاتف إلى الأحداث

يمكنك ربط الأحداث Hangouts و لمكالمات الفيديو على Google Meet السماح للمستخدمين بالاجتماع عن بُعد عبر مكالمة هاتفية أو مكالمة فيديو.

يمكن للحقل conferenceData استخدامها لقراءة تفاصيل المؤتمر الحالية ونسخها ومحوها يمكن أن تكون أيضًا يُستخدم لطلب إنشاء مؤتمرات جديدة. للسماح بالإنشاء تعديل تفاصيل مكالمة الفيديو، ضبط طلب conferenceDataVersion إلى 1.

هناك ثلاثة أنواع من conferenceData متاحة حاليًا، كما يُشار إليه في السمة conferenceData.conferenceSolution.key.type:

  1. Hangouts للمستهلكين (eventHangout)
  2. تطبيق Hangouts الكلاسيكي Google Workspace للمستخدمين (متوقّف نهائيًا، eventNamedHangout)
  3. Google Meet (hangoutsMeet)

يمكنك التعرّف على نوع مكالمة الفيديو المتوافق مع أي تقويم من المستخدم من خلال الاطّلاع على conferenceProperties.allowedConferenceSolutionTypes في وcalendars المجموعات: calendarList يمكنك أيضًا معرفة ما إذا كان المستخدم يفضل إنشاء Hangouts لجميع التي تم إنشاؤها عن طريق وضع علامة في المربّع بجانب الإعداد "autoAddHangouts" في مجموعة settings.

وبالإضافة إلى type، توفّر conferenceSolution أيضًا السمة name iconUri حقلاً يمكنك استخدامه لتمثيل حل مكالمة الفيديو كما هو موضّح أدناه:

JavaScript

const solution = event.conferenceData.conferenceSolution;

const content = document.getElementById("content");
const text = document.createTextNode("Join " + solution.name);
const icon = document.createElement("img");
icon.src = solution.iconUri;

content.appendChild(icon);
content.appendChild(text);

يمكنك إنشاء مكالمة فيديو جديدة لأحد الأحداث من خلال توفير createRequest مع requestId تم إنشاؤه حديثًا، ويمكن أن يكون string عشوائيًا. المؤتمرات بشكل غير متزامن، ولكن يمكنك دائمًا التحقق من حالة طلبك لإعلام المستخدمين بما يحدث.

على سبيل المثال، لطلب إنشاء مكالمة فيديو لحدث حالي:

JavaScript

const eventPatch = {
  conferenceData: {
    createRequest: {requestId: "7qxalsvy0e"}
  }
};

gapi.client.calendar.events.patch({
  calendarId: "primary",
  eventId: "7cbh8rpc10lrc0ckih9tafss99",
  resource: eventPatch,
  sendNotifications: true,
  conferenceDataVersion: 1
}).execute(function(event) {
  console.log("Conference created for event: %s", event.htmlLink);
});

قد لا يحتوي الرد الفوري على هذه المكالمة حتى الآن على محتوى معبأ بالكامل conferenceData; ويُشار إلى ذلك برمز الحالة pending في الحالة . يتغيّر رمز الحالة إلى success بعد أن تصبح معلومات مكالمة الفيديو سارية. . يتضمن الحقل entryPoints معلومات حول الفيديو معرفات الموارد المنتظمة (URI) للهاتف متوفرة للمستخدمين للاتصال بها.

إذا كنت تريد جدولة أحداث تقويم متعددة باستخدام نفس تفاصيل مكالمة الفيديو، يمكنك نسخ conferenceData بالكامل من حدث واحد إلى البعض

يكون النسخ مفيدًا في مواقف معينة. على سبيل المثال، لنفترض أنك تقوم بتطوير طلب توظيف يُعِدّ أحداثًا منفصلة للمرشح مجري المقابلة - أنت تريد حماية هوية مجري المقابلة، ولكنك أيضًا تريد التأكد من انضمام جميع المشاركين إلى نفس المكالمة الجماعية.