Membuat peristiwa

Bayangkan sebuah aplikasi yang membantu pengguna menemukan rute pendakian terbaik. Dengan menambahkan rencana pendakian sebagai acara kalender, pengguna mendapatkan banyak bantuan untuk tetap terorganisir secara otomatis. Google Kalender membantu mereka membagikan rencana dan mengingatkan mereka tentang rencana tersebut sehingga mereka dapat bersiap tanpa stres. Selain itu, berkat integrasi produk Google yang lancar, Google Now akan mengirimkan notifikasi tentang waktu berangkat dan Google Maps akan mengarahkannya ke tempat pertemuan tepat waktu.

Artikel ini menjelaskan cara membuat acara kalender dan menambahkannya ke kalender pengguna.

Tambahkan acara

Untuk membuat peristiwa, panggil metode events.insert() yang menyediakan setidaknya parameter berikut:

  • calendarId adalah ID kalender dan dapat berupa alamat email kalender tempat acara dibuat atau kata kunci khusus 'primary' yang akan menggunakan kalender utama pengguna yang login. Jika tidak mengetahui alamat email kalender yang ingin digunakan, Anda dapat memeriksanya di setelan kalender UI web Google Kalender (di bagian "Alamat Kalender") atau Anda dapat mencarinya di hasil panggilan calendarList.list().
  • event adalah peristiwa yang akan dibuat dengan semua detail yang diperlukan seperti awal dan akhir. Hanya dua kolom yang diperlukan, yaitu waktu start dan end. Lihat referensi event untuk mengetahui kumpulan lengkap kolom peristiwa.

Agar berhasil membuat peristiwa, Anda harus:

  • Tetapkan cakupan OAuth ke https://www.googleapis.com/auth/calendar sehingga Anda memiliki akses edit ke kalender pengguna.
  • Pastikan pengguna yang diautentikasi memiliki akses tulis ke kalender dengan calendarId yang Anda berikan (misalnya dengan memanggil calendarList.get() untuk calendarId dan memeriksa accessRole).

Menambahkan metadata peristiwa

Anda dapat menambahkan metadata acara secara opsional saat membuat acara kalender. Jika memilih untuk tidak menambahkan metadata selama pembuatan, Anda dapat memperbarui banyak kolom menggunakan events.update(); namun, beberapa kolom, seperti ID peristiwa, hanya dapat ditetapkan selama operasi events.insert().

Lokasi

Menambahkan alamat ke kolom lokasi akan mengaktifkan fitur seperti

"waktu untuk berangkat" atau menampilkan peta dengan rute.

ID Peristiwa

Saat membuat peristiwa, Anda dapat memilih untuk membuat ID peristiwa Anda sendiri

yang sesuai dengan persyaratan format kami. Hal ini memungkinkan Anda membuat entitas di database lokal tetap sinkron dengan acara di Google Kalender. Hal ini juga mencegah pembuatan acara duplikat jika operasi gagal pada suatu saat setelah berhasil dieksekusi di backend Kalender. Jika tidak ada ID peristiwa yang diberikan, server akan membuatnya untuk Anda. Lihat referensi ID peristiwa untuk mengetahui informasi selengkapnya.

Peserta

Acara yang Anda buat akan muncul di semua Google Kalender utama

tamu yang Anda sertakan dengan ID peristiwa yang sama. Jika Anda menetapkan sendNotifications ke true pada permintaan penyisipan, peserta juga akan menerima notifikasi email untuk acara Anda. Lihat panduan acara dengan beberapa peserta untuk mengetahui informasi selengkapnya.

Contoh berikut menunjukkan cara membuat peristiwa dan menetapkan metadatanya:

Go

// 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}"

Menambahkan lampiran Drive ke acara

Anda dapat melampirkan file Google Drive seperti catatan rapat di Dokumen, anggaran di Spreadsheet, presentasi di Slide, atau file Google Drive lainnya yang relevan ke acara kalender Anda. Anda dapat menambahkan lampiran saat membuat peristiwa dengan events.insert() atau yang lebih baru sebagai bagian dari update seperti dengan events.patch()

Dua bagian untuk melampirkan file Google Drive ke acara adalah:

  1. Dapatkan URL alternateLink, title, dan mimeType file dari resource File Drive API, biasanya dengan metode files.get().
  2. Buat atau perbarui peristiwa dengan kolom attachments yang ditetapkan dalam isi permintaan dan parameter supportsAttachments yang ditetapkan ke true.

Contoh kode berikut menunjukkan cara memperbarui peristiwa yang ada untuk menambahkan lampiran:

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()

Menambahkan konferensi video dan telepon ke acara

Anda dapat mengaitkan peristiwa dengan konferensi Hangouts dan Google Meet untuk memungkinkan pengguna melakukan rapat jarak jauh melalui panggilan telepon atau panggilan video.

Kolom conferenceData dapat digunakan untuk membaca, menyalin, dan menghapus detail konferensi yang ada; kolom ini juga dapat digunakan untuk meminta pembuatan konferensi baru. Untuk mengizinkan pembuatan dan perubahan detail konferensi, tetapkan parameter permintaan conferenceDataVersion ke 1.

Ada tiga jenis conferenceData yang saat ini didukung, seperti yang ditunjukkan oleh conferenceData.conferenceSolution.key.type:

  1. Hangouts untuk konsumen (eventHangout)
  2. Hangouts klasik untuk pengguna (tidak digunakan lagi; eventNamedHangout)
  3. Google Meet (hangoutsMeet)

Anda dapat mempelajari jenis konferensi yang didukung untuk kalender pengguna tertentu dengan melihat conferenceProperties.allowedConferenceSolutionTypes dalam koleksi calendars dan calendarList. Anda juga dapat mengetahui apakah pengguna lebih suka membuat Hangouts untuk semua acara yang baru dibuat dengan memeriksa setelan autoAddHangouts di koleksi settings.

Selain type, conferenceSolution juga menyediakan kolom name dan iconUri yang dapat Anda gunakan untuk merepresentasikan solusi konferensi seperti yang ditunjukkan di bawah ini:

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);

Anda dapat membuat konferensi baru untuk suatu peristiwa dengan memberikan createRequest dengan requestId yang baru dibuat yang dapat berupa string acak. Konferensi dibuat secara asinkron, tetapi Anda selalu dapat memeriksa status permintaan untuk memberi tahu pengguna tentang apa yang terjadi.

Misalnya, untuk meminta pembuatan konferensi untuk peristiwa yang ada:

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);
});

Respons langsung untuk panggilan ini mungkin belum berisi conferenceData yang terisi penuh; hal ini ditunjukkan dengan kode status pending di kolom status. Kode status berubah menjadi success setelah informasi konferensi diisi. Kolom entryPoints berisi informasi tentang URI video dan ponsel yang tersedia bagi pengguna untuk melakukan panggilan masuk.

Jika ingin menjadwalkan beberapa acara Kalender dengan detail konferensi yang sama, Anda dapat menyalin seluruh conferenceData dari satu acara ke acara lainnya.

Menyalin berguna dalam situasi tertentu. Misalnya, Anda sedang mengembangkan aplikasi perekrutan yang menyiapkan peristiwa terpisah untuk kandidat dan pewawancara—Anda ingin melindungi identitas pewawancara, tetapi Anda juga ingin memastikan semua peserta bergabung ke panggilan konferensi yang sama.