เมื่อคุณระบุหรือสร้างรายงานที่ตรงกับความต้องการของคุณแล้ว ก็ถึงเวลาสร้างเอาต์พุต ผลลัพธ์ของรายงานจะเก็บไว้ในไฟล์รายงาน ซึ่งสามารถเรียกดูและจัดการได้โดยอัตโนมัติ ไฟล์รายงานถูกสร้างขึ้นจากการเรียกใช้รายงาน
คู่มือนี้แสดงรายละเอียดของการสร้างไฟล์รายงานผ่านบริการรายงาน
ค้นหารายงาน
ในการเรียกใช้รายงาน คุณจะต้องทราบรหัสของรายงาน หากคุณเพิ่งสร้างหรืออัปเดตรายงาน คุณดูค่านี้ได้ในช่อง id
ของทรัพยากรรายงานที่มีการส่งคืน ขอแนะนําให้ผู้ใช้จัดเก็บรหัสที่แสดงผลเหล่านี้ไว้ใช้ในการค้นหาในภายหลัง
หากคุณไม่ทราบรหัสของรายงานที่คุณต้องการเรียกใช้ คุณสามารถดูรายการของรายงานทั้งหมดที่มีอยู่เพื่อค้นหารายการที่คุณต้องการ ตัวอย่างด้านล่างแสดงวิธีดูรายงานด้วยเกณฑ์ที่ผู้ใช้กําหนด
C#
Report target = null;
ReportList reports;
String nextPageToken = null;
do {
// Create and execute the reports list request.
ReportsResource.ListRequest request = service.Reports.List(profileId);
request.PageToken = nextPageToken;
reports = request.Execute();
foreach (Report report in reports.Items) {
if (IsTargetReport(report)) {
target = report;
break;
}
}
// Update the next page token.
nextPageToken = reports.NextPageToken;
} while (target == null
&& reports.Items.Any()
&& !String.IsNullOrEmpty(nextPageToken));
Java
Report target = null;
ReportList reports;
String nextPageToken = null;
do {
// Create and execute the reports list request.
reports = reporting.reports().list(profileId).setPageToken(nextPageToken).execute();
for (Report report : reports.getItems()) {
if (isTargetReport(report)) {
target = report;
break;
}
}
// Update the next page token.
nextPageToken = reports.getNextPageToken();
} while (target == null
&& !reports.getItems().isEmpty()
&& !Strings.isNullOrEmpty(nextPageToken));
PHP
$target = null;
$response = null;
$pageToken = null;
do {
// Create and execute the report list request.
$response = $this->service->reports->listReports(
$userProfileId,
['pageToken' => $pageToken]
);
foreach ($response->getItems() as $report) {
if ($this->isTargetReport($report)) {
$target = $report;
break;
}
}
$pageToken = $response->getNextPageToken();
} while (empty($target) && !empty($response->getItems()) && !empty($pageToken));
Python
target = None
# Construct the request.
request = service.reports().list(profileId=profile_id)
while True:
response = request.execute()
for report in response['items']:
if is_target_report(report):
target = report
break
if not target and response['items'] and response['nextPageToken']:
request = service.reports().list_next(request, response)
else:
break
Ruby
page_token = nil
target = nil
loop do
result = service.list_reports(profile_id, page_token: page_token)
result.items.each do |report|
if target_report?(report)
target = report
break
end
end
page_token = (result.next_page_token if target.nil? && result.items.any?)
break if page_token.to_s.empty?
end
โปรดดูเอกสารอ้างอิงสําหรับพารามิเตอร์ที่ไม่บังคับที่คุณสามารถระบุเพื่อควบคุมวิธีจัดเรียงและเรียงลําดับรายการรายงานที่แสดงผล การควบคุมการจัดเรียงและการจัดลําดับรายการนี้อาจมีประโยชน์อย่างยิ่งในการค้นหารายงานที่แก้ไขล่าสุด
เรียกใช้รายงาน
เมื่อคุณพบรายงานที่ต้องการแล้ว คุณสามารถใช้บริการรายงานเพื่อเรียกใช้รายงานและสร้างไฟล์รายงานใหม่ได้ คุณสามารถเรียกใช้รายงานแบบซิงโครนัสหรืออะซิงโครนัส (ค่าเริ่มต้น) ทั้งนี้ขึ้นอยู่กับความซับซ้อนของรายงานและเวลาที่ใช้ในการประมวลผล โปรดดูคู่มือรายงานซิงโครนัสสําหรับรายละเอียดเกี่ยวกับการรายงานแบบซิงโครนัสกับอะซิงโครนัส
หากต้องการเรียกใช้รายงาน คุณต้องเรียกใช้เมธอดที่เรียกใช้ของบริการรายงาน ดังที่แสดงในตัวอย่างด้านล่าง
C#
// Run the report.
File file = service.Reports.Run(profileId, reportId).Execute();
Java
// Run the report.
File file = reporting.reports().run(profileId, reportId).execute();
PHP
// Run the report.
$file = $this->service->reports->run($userProfileId, $reportId);
Python
# Run the report.
report_file = service.reports().run(
profileId=profile_id, reportId=report_id).execute()
Ruby
# Run the report.
report_file = service.run_report(profile_id, report_id)
การตอบกลับคําขอนี้คือทรัพยากรไฟล์ หากนี่เป็นคําขอการเรียกใช้แบบซิงโครนัสที่เสร็จสมบูรณ์ ระบบจะกรอกช่องทั้งหมดของทรัพยากรที่แสดงผลและไฟล์จะพร้อมให้ดาวน์โหลด เนื่องจากนี่เป็นคําขอเรียกใช้แบบอะซิงโครนัส ช่องคีย์บางช่องจะหายไปและ status
ของไฟล์จะถูกตั้งเป็น PROCESSING
เนื่องจากรายงานยังไม่เสร็จสมบูรณ์
รายงานจะทํางานเสร็จเมื่อใด
เมื่อคุณเรียกใช้รายงานแบบอะซิงโครนัส ไฟล์ตัวยึดตําแหน่งจะปรากฏขึ้นทันทีและรวมรายงานไว้ในคิวเพื่อประมวลผล ตัวยึดตําแหน่งจะประกอบด้วยข้อมูลสําคัญ 2 อย่างเพื่อช่วยคุณในการพิจารณาว่ารายงานจะทํางานเสร็จเมื่อใด
- ช่อง
id
ซึ่งสามารถใช้อ้างอิงไฟล์นี้ในคําขอที่ตามมา - ช่อง
status
ซึ่งแสดงสถานะปัจจุบันของรายงาน
ในการตรวจสอบเวลาที่รายงานทํางานเสร็จแล้ว คุณจะต้องตรวจสอบ status
ของไฟล์เป็นระยะ ดังตัวอย่างด้านล่าง
C#
// Wait for the report file to finish processing.
// An exponential backoff policy is used to limit retries and conserve quota.
int sleep = 0;
int startTime = GetCurrentTimeInSeconds();
do {
File file = service.Files.Get(reportId, fileId).Execute();
if ("REPORT_AVAILABLE".Equals(file.Status)) {
Console.WriteLine("File status is {0}, ready to download.", file.Status);
return;
} else if (!"PROCESSING".Equals(file.Status)) {
Console.WriteLine("File status is {0}, processing failed.", file.Status);
return;
} else if (GetCurrentTimeInSeconds() - startTime > MAX_RETRY_ELAPSED_TIME) {
Console.WriteLine("File processing deadline exceeded.");
return;
}
sleep = GetNextSleepInterval(sleep);
Console.WriteLine("File status is {0}, sleeping for {1} seconds.", file.Status, sleep);
Thread.Sleep(sleep * 1000);
} while (true);
Java
BackOff backOff =
new ExponentialBackOff.Builder()
.setInitialIntervalMillis(10 * 1000) // 10 second initial retry
.setMaxIntervalMillis(10 * 60 * 1000) // 10 minute maximum retry
.setMaxElapsedTimeMillis(60 * 60 * 1000) // 1 hour total retry
.build();
do {
File file = reporting.files().get(reportId, fileId).execute();
if ("REPORT_AVAILABLE".equals(file.getStatus())) {
// File has finished processing.
System.out.printf("File status is %s, ready to download.%n", file.getStatus());
return file;
} else if (!"PROCESSING".equals(file.getStatus())) {
// File failed to process.
System.out.printf("File status is %s, processing failed.", file.getStatus());
return null;
}
// The file hasn't finished processing yet, wait before checking again.
long retryInterval = backOff.nextBackOffMillis();
if (retryInterval == BackOff.STOP) {
System.out.println("File processing deadline exceeded.%n");
return null;
}
System.out.printf("File status is %s, sleeping for %dms.%n", file.getStatus(), retryInterval);
Thread.sleep(retryInterval);
} while (true);
PHP
// Wait for the report file to finish processing.
// An exponential backoff policy is used to limit retries and conserve
// quota.
$sleep = 0;
$startTime = time();
do {
$file = $this->service->files->get($reportId, $fileId);
if ($file->getStatus() === 'REPORT_AVAILABLE') {
printf('File status is %s, ready to download<br>', $file->getStatus());
return $file;
} elseif ($file->getStatus() !== 'PROCESSING') {
printf('File status is %s, processing failed<br>', $file->getStatus());
return null;
} elseif (time() - $startTime > self::MAX_RETRY_ELAPSED_TIME) {
printf('File processing deadline exceeded<br>');
return null;
}
$sleep = $this->getNextSleepInterval($sleep);
printf(
'File status is %s, sleeping for %d seconds<br>',
$file->getStatus(),
$sleep
);
$this->sleep($sleep);
} while (true);
Python
# Wait for the report file to finish processing.
# An exponential backoff strategy is used to conserve request quota.
sleep = 0
start_time = time.time()
while True:
report_file = service.files().get(
reportId=report_id, fileId=file_id).execute()
status = report_file['status']
if status == 'REPORT_AVAILABLE':
print 'File status is %s, ready to download.' % status
return
elif status != 'PROCESSING':
print 'File status is %s, processing failed.' % status
return
elif time.time() - start_time > MAX_RETRY_ELAPSED_TIME:
print 'File processing deadline exceeded.'
return
sleep = next_sleep_interval(sleep)
print 'File status is %s, sleeping for %d seconds.' % (status, sleep)
time.sleep(sleep)
Ruby
# Wait for the report file to finish processing.
# An exponential backoff strategy is used to conserve request quota.
interval = 0
start_time = Time.now
loop do
report_file = service.get_file(report_id, file_id)
status = report_file.status
if status == 'REPORT_AVAILABLE'
puts format('File status is %s, ready to download.', status)
break
elsif status != 'PROCESSING'
puts format('File status is %s, processing failed.', status)
break
elsif Time.now - start_time > MAX_RETRY_ELAPSED_TIME
puts 'File processing deadline exceeded.'
break
end
interval = next_sleep_interval(interval)
puts format('File status is %s, sleeping for %d seconds.', status,
interval)
sleep(interval)
end
เมื่อ status
เปลี่ยนเป็น REPORT_AVAILABLE
ไฟล์จะพร้อมดาวน์โหลด ดังที่แสดงในตัวอย่างข้างต้น เราขอแนะนําอย่างยิ่งให้คุณใช้กลยุทธ์ Exponential Backoff เมื่อทําแบบสํารวจเช่นนี้ เพื่อเป็นการเพิ่มประสิทธิภาพการใช้โควต้าคําขอของคุณ