สคริปต์ Google Ads มักจะต้องทำงานกับวันที่และเวลา กรณีการใช้งานทั่วไป ได้แก่ การดึงข้อมูลรายงานสำหรับช่วงวันที่ที่เฉพาะเจาะจง การกำหนดเวลาแคมเปญหรือ กลุ่มโฆษณาให้ทํางานในเวลาที่เฉพาะเจาะจง และการส่งออกเวลาที่สคริปต์ ทํางานล่าสุดไปยังสเปรดชีต คู่มือนี้อธิบายแนวคิดที่สำคัญ ข้อผิดพลาดที่พบบ่อย และแนวทางที่แนะนำเมื่อทำงานกับวันที่และเวลาในสคริปต์ Google Ads
แนวคิดพื้นฐาน
หากต้องการทํางานกับวันที่และเวลาในสคริปต์ Google Ads ให้ใช้ออบเจ็กต์วันที่ในตัวของ JavaScript ออบเจ็กต์วันที่ JavaScript แสดงถึงช่วงเวลาหนึ่งๆ การสร้างออบเจ็กต์วันที่ใหม่ทำได้หลายวิธี ดังนี้
// 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, 2025 13:00:00 -0500');
// Create a copy of an existing date object.
let copy = new Date(date);
ผู้ใช้ Apps Script ใหม่ๆ มักสับสนเกี่ยวกับวิธีที่ออบเจ็กต์วันที่จัดการเขตเวลา วิธีคิดเกี่ยวกับออบเจ็กต์วันที่ที่ไม่ถูกต้องแต่เป็นวิธีที่เป็นธรรมชาติคือการคิดว่าออบเจ็กต์วันที่คือเวลาบนนาฬิกาในเขตเวลาเดียว ตัวอย่างเช่น ในข้อมูลโค้ดด้านบน ผู้ใช้บางราย
เข้าใจผิดว่า date
ใช้ได้ในเขตเวลาเดียวเท่านั้น นั่นคือ
เขตเวลาที่มีออฟเซ็ต -5 ชั่วโมงซึ่งใช้ในการสร้าง ในมุมมองที่ผิดพลาดนั้น date
จะต้อง "แปลง" เพื่อใช้ในเขตเวลาอื่นๆ
แต่วิธีที่ถูกต้องในการพิจารณาออบเจ็กต์วันที่คือการพิจารณาเป็นช่วงเวลาหนึ่งๆ โดยไม่ขึ้นอยู่กับเขตเวลาใดๆ แม้ว่าเวลาหนึ่งๆ จะ แสดงแตกต่างกันในนาฬิกาในเขตเวลาต่างๆ แต่ก็เป็นเวลาเดียวกัน เช่น ลองดูตัวอย่างโค้ดต่อไปนี้
// Create two date objects with different times and timezone offsets.
const date1 = new Date('February 17, 2025 13:00:00 -0500');
const date2 = new Date('February 17, 2025 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);
เนื่องจากออบเจ็กต์วันที่แสดงถึงช่วงเวลาหนึ่งๆ จึงไม่จำเป็นต้อง "แปลง" ในเขตเวลาต่างๆ แต่จะแสดงเป็นสตริงที่จัดรูปแบบสำหรับเขตเวลาหนึ่งๆ ได้
หากต้องการแสดงวันที่เป็นสตริงที่มีรูปแบบและเขตเวลาที่เฉพาะเจาะจง ให้ใช้
Utilities.formatDate(date, timeZone,
format)
ตัวอย่างเช่น
const date = new Date('February 17, 2025 13:00:00 -0500');
// February 17, 2025 13:00:00 -0500
console.log(Utilities.formatDate(date, 'America/New_York', 'MMMM dd, yyyy HH:mm:ss Z'));
// February 17, 2025 10:00:00 -0800
console.log(Utilities.formatDate(date, 'America/Los_Angeles', 'MMMM dd, yyyy HH:mm:ss Z'));
// 2025-02-17T18:00:00.000Z
console.log(Utilities.formatDate(date, 'Etc/GMT', 'yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\''));
ตัวอย่างเหล่านี้ระบุเขตเวลาโดยตรงโดยใช้รหัส
เขตเวลา หากต้องการดึงข้อมูล
เขตเวลาที่เชื่อมโยงกับบัญชี Google Ads ที่เรียกใช้สคริปต์ ให้ใช้
AdsApp.currentAccount().getTimeZone()
ข้อผิดพลาดที่พบบ่อย
ข้อผิดพลาดที่พบบ่อยเกี่ยวกับวันที่มีดังนี้
เขตเวลาเริ่มต้นเมื่อบันทึกออบเจ็กต์วันที่
เมื่อบันทึกออบเจ็กต์วันที่โดยตรงโดยใช้ Logger.log()
ระบบจะแสดงผลโดยใช้รูปแบบและเขตเวลาเริ่มต้น
เช่น
const date = new Date('February 17, 2025 13:00:00 -0500');
// Mon Feb 17 10:00:00 GMT-08:00 2025
console.log(date);
เขตเวลาเริ่มต้นคืออเมริกา/ลอสแอนเจลิส (เวลาแปซิฟิก) ไม่ว่าเขตเวลาที่เชื่อมโยงกับบัญชี Google Ads จะเป็นอะไรก็ตาม หากต้องการแสดงผลออบเจ็กต์วันที่เป็นสตริงโดยใช้รูปแบบและเขตเวลาที่กำหนดเองสำหรับการบันทึกหรือ
วัตถุประสงค์อื่นๆ ให้ใช้ Utilities.formatDate(date, timeZone,
format)
เสมอ
เขตเวลาเริ่มต้นเมื่อสร้างออบเจ็กต์วันที่
เมื่อสร้างออบเจ็กต์วันที่โดยใช้สตริงที่ไม่ได้ระบุออฟเซ็ตเขตเวลา ระบบจะถือว่าเขตเวลาคือ America/Los_Angeles (เวลาแปซิฟิก) ไม่ว่าเขตเวลาที่เชื่อมโยงกับบัญชี Google Ads จะเป็นอะไรก็ตาม เช่น
// Create a date without specifying the timezone offset.
const date = new Date('February 17, 2025 13:00:00');
// Mon Feb 17 13:00:00 GMT-08:00 2025
console.log(date);
เมื่อสร้างออบเจ็กต์วันที่โดยใช้สตริง ให้ระบุออฟเซ็ตเขตเวลาเสมอเพื่อ ให้มั่นใจว่าออบเจ็กต์วันที่แสดงช่วงเวลาที่คุณต้องการจริงๆ
เขตเวลาเริ่มต้นในเมธอดออบเจ็กต์วันที่
ออบเจ็กต์วันที่ JavaScript มีหลายวิธีที่ใช้เขตเวลาเริ่มต้น เช่น
getFullYear()
getMonth()
getDate()
getDay()
getHours()
getMinutes()
รวมถึงset___()
ที่เทียบเท่าของวิธีการเหล่านี้ด้วย (เช่น
setMonth()
) และgetTimezoneOffset()
ในสคริปต์ Google Ads เขตเวลาเริ่มต้นคืออเมริกา/ลอสแอนเจลิส (เวลาแปซิฟิก) ไม่ว่าเขตเวลาที่เชื่อมโยงกับบัญชี Google Ads จะเป็นอะไรก็ตาม ดังนั้น หากบัญชี Google Ads ไม่ได้อยู่ในเขตเวลาดังกล่าว คุณควรหลีกเลี่ยงการใช้วิธีการเหล่านี้ โดยทั่วไป
หากต้องการรับปี เดือน วัน ชั่วโมง หรือนาทีสำหรับออบเจ็กต์วันที่ในเขตเวลาของบัญชี ให้ใช้ Utilities.formatDate(date, timeZone,
format)
กับรูปแบบที่ระบุส่วนของวันที่หรือเวลาที่ต้องการ และใช้ AdsApp.currentAccount().getTimeZone()
เพื่อรับเขตเวลาของบัญชี
การสร้างออบเจ็กต์วันที่จากสตริงวันที่ที่จัดรูปแบบแล้ว
คุณสร้างออบเจ็กต์วันที่ได้โดยส่งสตริงวันที่ที่จัดรูปแบบแล้วไปยังตัวสร้างวันที่ เช่น
const date = new Date('February 17, 2025 13:00:00 -0500');
ตัวสร้างจะแยกวิเคราะห์ได้เฉพาะสตริงวันที่บางรูปแบบเท่านั้น โปรดระบุสตริงวันที่ในรูปแบบ MMMM dd, yyyy
HH:mm:ss Z
เสมอเพื่อให้มั่นใจว่าระบบจะแยกวิเคราะห์สตริงวันที่ได้อย่างถูกต้อง
ตัวอย่างเช่น หากต้องการสร้างออบเจ็กต์วันที่สำหรับเที่ยงวันนี้ในเขตเวลาของบัญชีปัจจุบัน ให้ทำดังนี้
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);
อย่าใช้รูปแบบ "z" เพื่อสร้างสตริงวันที่ที่จะส่งไปยังตัวสร้างวันที่ เนื่องจากตัวสร้างอาจแยกวิเคราะห์สตริงดังกล่าวไม่ได้เสมอไป ใช้เฉพาะรูปแบบ "Z"
การคำนวณวันที่
สคริปต์บางรายการต้องทำการคำนวณทางคณิตศาสตร์อย่างง่ายกับวันที่ เช่น การหาวันที่ X
วันก่อนหรือหลังวันที่ที่กำหนด เมื่อทำการคำนวณวันที่ ให้ใช้ getTime()
การเรียกใช้ getTime()
ในออบเจ็กต์วันที่จะแสดงผลจำนวนมิลลิวินาทีตั้งแต่
ต้นวันที่ 1 มกราคม 1970 UTC คุณสามารถดำเนินการทางคณิตศาสตร์กับค่านี้ จากนั้น
ใช้ค่าใหม่กับออบเจ็กต์วันที่โดยใช้ setTime()
หรือระบุเป็น
พารามิเตอร์เมื่อสร้างออบเจ็กต์วันที่ใหม่
เช่น
const MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
const now = new Date();
const yesterday = new Date(now.getTime() - MILLIS_PER_DAY);
ในตัวอย่างนี้ yesterday
คือ 24 ชั่วโมงที่แล้ว
การรายงาน
เมื่อดึงข้อมูลรายงานโดยใช้
AdsApp.search()
คําค้นหา GAQL จะต้องระบุวันที่ในรูปแบบ yyyy-MM-dd
(เช่น 2025-06-30
จะเป็น
30 มิถุนายน 2025)
ในทำนองเดียวกัน getStatsFor()
วิธีที่มีอยู่ในออบเจ็กต์สคริปต์ Google Ads หลายรายการ
กำหนดให้ต้องระบุวันที่ในรูปแบบเดียวกัน ใช้
Utilities.formatDate(date, timeZone,
format)
เพื่อจัดรูปแบบออบเจ็กต์วันที่ในรูปแบบนี้
เช่น หากต้องการดึงข้อมูลรายงานย้อนหลัง 1-3 วัน ให้ทำดังนี้
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'));
สเปรดชีต
สคริปต์ Google Ads มักจะเขียนเอาต์พุตลงในสเปรดชีต ซึ่งรวมถึงออบเจ็กต์วันที่ เมื่อตั้งค่าเซลล์ในสเปรดชีตโดยส่งออบเจ็กต์วันที่ ระบบจะใช้เขตเวลาของสเปรดชีตเพื่อตีความวันที่ดังกล่าว ตัวอย่างเช่น สมมติว่าเรามีสเปรดชีตที่ตั้งค่าเขตเวลาเป็นเวลาแปซิฟิก
// Suppose today is February 17, 2025 13:00:00 -0500 (Eastern Time)
const now = new Date();
spreadsheet.getRange('A1').setValue(now);
ค่าใน A1 จะเป็น 17-Feb-25 10:00:00
หากต้องการให้ระบบเขียนออบเจ็กต์วันที่ลงในสเปรดชีตตามที่คุณต้องการ ให้ตั้งค่าเขตเวลาของสเปรดชีตให้ตรงกับเขตเวลาของบัญชี Google Ads โดยทำดังนี้
spreadsheet.setSpreadsheetTimeZone(AdsApp.currentAccount().getTimeZone());
นอกจากนี้ คุณยังตั้งเวลาของสเปรดชีต ด้วยตนเองได้ด้วย