Menggunakan Tanggal dan Waktu

Skrip Google Ads sering kali perlu menyertakan tanggal dan waktu. Kasus penggunaan umum meliputi pengambilan laporan untuk rentang tanggal tertentu, menjadwalkan kampanye atau grup iklan untuk dijalankan pada waktu tertentu, dan menampilkan waktu terakhir skrip dijalankan ke spreadsheet. Panduan ini menjelaskan konsep penting, kesalahan umum, dan pendekatan yang direkomendasikan saat menggunakan tanggal dan waktu dalam skrip Google Ads.

Konsep dasar

Untuk menggunakan tanggal dan waktu dalam skrip Google Ads, gunakan objek tanggal bawaan JavaScript. Objek tanggal JavaScript mewakili momen tertentu. Ada beberapa cara untuk membuat objek tanggal baru:

// Create a date object for the current date and time.
const now = new Date();

// Create a date object for a past date and time using a formatted string.
const date = new Date('February 17, 2021 13:00:00 -0500');

// Create a copy of an existing date object.
let copy = new Date(date);

Pengguna Skrip baru sering kali bingung dengan cara objek tanggal menangani zona waktu. Cara yang alami tetapi salah untuk memahami objek tanggal adalah sebagai waktu pada jam dalam satu zona waktu. Misalnya, dalam cuplikan di atas, beberapa pengguna salah mengira bahwa date hanya valid di satu zona waktu, yaitu zona waktu dengan offset -5 jam yang digunakan untuk membuatnya. Dalam tampilan yang salah tersebut, date harus "dikonversi" agar dapat digunakan di zona waktu lain.

Sebagai gantinya, cara yang benar untuk memahami objek tanggal adalah sebagai waktu tertentu yang tidak bergantung pada zona waktu mana pun. Meskipun momen tertentu ditampilkan secara berbeda pada jam di zona waktu yang berbeda, momen tersebut sama. Misalnya, perhatikan cuplikan ini:

// Create two date objects with different times and timezone offsets.
const date1 = new Date('February 17, 2021 13:00:00 -0500');
const date2 = new Date('February 17, 2021 10:00:00 -0800');

// getTime() returns the number of milliseconds since the beginning of
// January 1, 1970 UTC.
// True, as the dates represent the same moment in time.
console.log(date1.getTime() == date2.getTime());

// False, as the dates are separate objects, though they happen to
// represent the same moment in time.
console.log(date1 == date2);

Karena objek tanggal mewakili momen tertentu, objek tersebut tidak perlu "dikonversi" di seluruh zona waktu. Namun, dapat dirender sebagai string yang diformat untuk zona waktu tertentu.

Untuk merender tanggal sebagai string dengan format dan zona waktu tertentu, gunakan Utilities.formatDate(date, timeZone, format). Contoh:

const date = new Date('February 17, 2021 13:00:00 -0500');

// February 17, 2021 13:00:00 -0500
console.log(Utilities.formatDate(date, 'America/New_York', 'MMMM dd, yyyy HH:mm:ss Z'));

// February 17, 2021 10:00:00 -0800
console.log(Utilities.formatDate(date, 'America/Los_Angeles', 'MMMM dd, yyyy HH:mm:ss Z'));

// 2021-02-17T18:00:00.000Z
console.log(Utilities.formatDate(date, 'Etc/GMT', 'yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\''));

Contoh ini menentukan zona waktu secara langsung menggunakan ID zona waktu. Untuk mengambil zona waktu yang terkait dengan akun Google Ads yang menjalankan skrip Anda, gunakan AdsApp.currentAccount().getTimeZone().

Kesalahan umum

Zona waktu default saat mencatat objek tanggal

Saat langsung mencatat objek tanggal menggunakan Logger.log(), objek tersebut akan dirender menggunakan format dan zona waktu default. Contoh:

const date = new Date('February 17, 2021 13:00:00 -0500');

// Wed Feb 17 10:00:00 GMT-08:00 2021
console.log(date);

Zona waktu default adalah Amerika Serikat/Los_Angeles (waktu Pasifik), terlepas dari zona waktu yang terkait dengan akun Google Ads. Jika Anda ingin merender objek tanggal sebagai string menggunakan format kustom dan zona waktu untuk logging atau tujuan lainnya, selalu gunakan Utilities.formatDate(date, timeZone, format).

Zona waktu default saat membuat objek tanggal

Saat membuat objek tanggal menggunakan string yang tidak memberikan offset zona waktu, zona waktu dianggap sebagai America/Los_Angeles (waktu Pasifik), terlepas dari zona waktu yang terkait dengan akun Google Ads. Contoh:

// Create a date without specifying the timezone offset.
const date = new Date('February 17, 2021 13:00:00');

// Wed Feb 17 13:00:00 GMT-08:00 2021
console.log(date);

Saat membuat objek tanggal menggunakan string, selalu sertakan offset zona waktu untuk memastikan objek tanggal mewakili momen yang sebenarnya Anda inginkan.

Zona waktu default dalam metode objek tanggal

Objek tanggal JavaScript memiliki beberapa metode yang mengasumsikan zona waktu default, seperti:

  • getFullYear()
  • getMonth()
  • getDate()
  • getDay()
  • getHours()
  • getMinutes()

Ini juga mencakup padanan set___() metode ini (misalnya, setMonth()), dan getTimezoneOffset().

Dalam skrip Google Ads, zona waktu default adalah Amerika Serikat/Los_Angeles (waktu Pasifik), terlepas dari zona waktu yang terkait dengan akun Google Ads. Oleh karena itu, kecuali akun Google Ads Anda berada dalam zona waktu ini, sebaiknya hindari penggunaan metode tersebut.

Guna mendapatkan tahun, bulan, tanggal, hari, jam, atau menit untuk objek tanggal di zona waktu akun Anda, gunakan Utilities.formatDate(date, timeZone, format) dengan format yang menentukan bagian tanggal atau waktu yang Anda inginkan, dan gunakan AdsApp.currentAccount().getTimeZone() untuk mendapatkan zona waktu akun Anda.

Membuat objek tanggal dari string tanggal yang diformat

Anda dapat membuat objek tanggal dengan meneruskan string tanggal yang diformat ke konstruktor tanggal. Contoh:

const date = new Date('February 17, 2021 13:00:00 -0500');

Konstruktor hanya dapat mengurai format string tanggal tertentu. Untuk memastikan string tanggal Anda diuraikan dengan benar, selalu berikan dalam format MMMM dd, yyyy HH:mm:ss Z.

Misalnya, untuk membuat objek tanggal pada siang hari ini di zona waktu akun saat ini:

const now = new Date();
const timeZone = AdsApp.currentAccount().getTimeZone();
const noonString = Utilities.formatDate(now, timeZone, 'MMMM dd, yyyy 12:00:00 Z');
const noon = new Date(noonString);

Jangan gunakan pola 'z' untuk membuat string tanggal yang akan diteruskan ke konstruktor tanggal, karena konstruktor tidak akan selalu dapat mengurainya. Hanya gunakan pola 'Z'.

Matematika tanggal

Beberapa skrip perlu melakukan penghitungan sederhana dengan tanggal, seperti menemukan tanggal X hari sebelum atau setelah tanggal tertentu. Saat melakukan matematika tanggal, gunakan getTime(). Memanggil getTime() pada objek tanggal akan menampilkan jumlah milidetik sejak awal 1 Januari 1970 UTC. Anda dapat melakukan perhitungan matematika pada nilai ini, lalu menerapkan nilai baru ke objek tanggal menggunakan setTime() atau memberikannya sebagai parameter saat membuat objek tanggal baru.

Contoh:

const MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
const now = new Date();
const yesterday = new Date(now.getTime() - MILLIS_PER_DAY);

Dalam contoh ini, yesterday tepat 24 jam yang lalu.

Pelaporan

Saat mengambil laporan menggunakan AdsApp.search(), kueri GAQL mengharuskan tanggal ditentukan dalam format yyyy-MM-dd (misalnya, 2021-06-30 adalah 30 Juni 2021).

Demikian pula, metode getStatsFor() yang tersedia di banyak objek skrip Google Ads memerlukan tanggal yang ditentukan dalam format yang sama. Gunakan Utilities.formatDate(date, timeZone, format) untuk memformat objek tanggal dalam format ini.

Misalnya, untuk mengambil laporan dari satu hingga tiga hari yang lalu:

const MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
const now = new Date();
const from = new Date(now.getTime() - 3 * MILLIS_PER_DAY);
const to = new Date(now.getTime() - 1 * MILLIS_PER_DAY);

const timeZone = AdsApp.currentAccount().getTimeZone();
const results = AdsApp.search(
  'SELECT campaign.name, metrics.clicks' +
  'FROM campaign ' +
  'WHERE segments.date BETWEEN ' +
    Utilities.formatDate(from, timeZone, 'yyyy-MM-dd') + ' AND ' +
    Utilities.formatDate(to, timeZone, 'yyyy-MM-dd'));

Spreadsheet

Skrip Google Ads sering kali menulis output ke spreadsheet, termasuk objek tanggal. Saat menetapkan sel dalam spreadsheet dengan meneruskan objek tanggal, zona waktu spreadsheet digunakan untuk menafsirkan tanggal tersebut. Misalnya, kita memiliki spreadsheet yang zona waktunya disetel ke Waktu Pasifik:

// Suppose today is February 17, 2021 13:00:00 -0500 (Eastern Time)
const now = new Date();
spreadsheet.getRange('A1').setValue(now);

Nilai di A1 akan menjadi 17-Feb-21 10:00:00.

Untuk memastikan objek tanggal ditulis ke spreadsheet seperti yang Anda harapkan, tetapkan zona waktu spreadsheet agar cocok dengan zona waktu akun Google Ads Anda:

spreadsheet.setSpreadsheetTimeZone(AdsApp.currentAccount().getTimeZone());

Anda juga dapat menyetel waktu spreadsheet secara manual.