Halaman ini membahas berbagai praktik terbaik untuk pengembangan dengan skrip Google Ads.
Pemilih
Memfilter dengan pemilih
Jika memungkinkan, gunakan filter untuk hanya meminta entitas yang Anda perlukan. Mendaftar filter yang tepat memiliki manfaat berikut:
- Kode ini lebih sederhana dan lebih mudah dipahami.
- Skrip akan dijalankan jauh lebih cepat.
Bandingkan cuplikan kode berikut:
Pendekatan coding | Cuplikan kode |
---|---|
Memfilter menggunakan pemilih (direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 10') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); // Do work here. } |
Memfilter dalam kode (tidak direkomendasikan) |
var keywords = AdsApp.keywords().get(); while (keywords.hasNext()) { var keyword = keywords.next(); var stats = keyword.getStatsFor( 'LAST_MONTH'); if (stats.getClicks() > 10) { // Do work here. } } |
Pendekatan kedua tidak direkomendasikan karena mencoba mengambil daftar semua kata kunci di akun Anda hanya untuk menerapkan filter ke daftar tersebut.
Menghindari penelusuran hierarki kampanye
Jika Anda ingin mengambil entitas di tingkat tertentu, gunakan metode koleksi di tingkat tersebut, bukan menjelajahi seluruh hierarki kampanye. Selain lebih sederhana, hal ini juga akan berperforma jauh lebih baik: sistem tidak perlu membaca semua kampanye dan grup iklan secara tidak perlu.
Bandingkan cuplikan kode berikut yang mengambil semua iklan di akun Anda:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan metode pengumpulan yang sesuai (Direkomendasikan) |
var ads = AdsApp.ads(); |
Melintasi hierarki (Tidak direkomendasikan) |
var campaigns = AdsApp.campaigns().get(); while (campaigns.hasNext()) { var adGroups = campaigns.next(). adGroups().get(); while (adGroups.hasNext()) { var ads = adGroups.next().ads().get(); // Do your work here. } } |
Pendekatan kedua tidak direkomendasikan karena mencoba mengambil seluruh hierarki objek (kampanye, grup iklan) sedangkan hanya iklan yang diperlukan.
Menggunakan metode pengakses induk tertentu
Terkadang, Anda perlu mendapatkan parent entity objek yang diambil. Dalam hal ini, Anda harus menggunakan metode pengakses yang disediakan, bukan mengambil seluruh hierarki.
Bandingkan cuplikan kode berikut yang mengambil grup iklan yang memiliki iklan teks dengan lebih dari 50 klik bulan lalu:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan metode pengakses induk yang sesuai (direkomendasikan) |
var ads = AdsApp.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); var adGroup = ad.getAdGroup(); var campaign = ad.getCampaign(); // Store (campaign, adGroup) to an array. } |
Melintasi hierarki (tidak direkomendasikan) |
var campaigns = AdsApp.campaigns().get(); while (campaigns.hasNext()) { var adGroups = campaigns.next() .adGroups() .get(); while (adGroups.hasNext()) { var ads = adGroups.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); if (ads.totalNumEntities() > 0) { // Store (campaign, adGroup) to an array. } } } |
Pendekatan kedua tidak direkomendasikan karena mengambil seluruh hierarki kampanye dan grup iklan di akun Anda, sedangkan Anda hanya memerlukan sebagian kampanye dan grup iklan yang terkait dengan kumpulan iklan Anda. Yang pertama pendekatan ini membatasi dirinya sendiri untuk hanya mengambil koleksi iklan yang relevan, dan menggunakan metode yang tepat untuk mengakses objek induknya.
Menggunakan filter induk tertentu
Untuk mengakses entitas dalam kampanye atau grup iklan tertentu, gunakan di pemilih alih-alih mengambil, lalu menelusuri hierarki.
Bandingkan cuplikan kode berikut yang mengambil daftar iklan teks dalam kampanye dan grup iklan tertentu yang memiliki lebih dari 50 klik terakhir bulan berikutnya.
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan filter tingkat induk yang sesuai (direkomendasikan) |
var ads = AdsApp.ads() .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); var adGroup = ad.getAdGroup(); var campaign = ad.getCampaign(); // Store (campaign, adGroup, ad) to // an array. } |
Melintasi hierarki (tidak direkomendasikan) |
var campaigns = AdsApp.campaigns() .withCondition('Name = "Campaign 1"') .get(); while (campaigns.hasNext()) { var adGroups = campaigns.next() .adGroups() .withCondition('Name = "AdGroup 1"') .get(); while (adGroups.hasNext()) { var ads = adGroups.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); // Store (campaign, adGroup, ad) to // an array. } } } |
Pendekatan kedua tidak direkomendasikan karena melakukan iterasi pada kampanye dan iklan hierarki grup di akun, sedangkan Anda hanya memerlukan sekumpulan iklan yang dipilih, dan kampanye serta grup iklan induknya. Pendekatan pertama membatasi iterasi ke daftar iklan dengan menerapkan filter tertentu untuk entity induk di pemilih.
Gunakan ID untuk pemfilteran jika memungkinkan
Saat memfilter entitas, sebaiknya filter entitas berdasarkan ID, alih-alih {i>field<i} lainnya.
Pertimbangkan cuplikan kode berikut yang memilih kampanye.
Pendekatan coding | Cuplikan kode |
---|---|
Filter menurut ID (direkomendasikan) |
var campaign = AdsApp.campaigns() .withIds([12345]) .get() .next(); |
Filter menurut Nama (kurang optimal) |
var campaign = AdsApp.campaigns() .withCondition('Name="foo"') .get() .next(); |
Pendekatan kedua kurang optimal karena kita memfilter berdasarkan kolom non-ID.
Filter menurut ID orang tua jika memungkinkan
Saat memilih entity, filter menurut ID induk jika memungkinkan. Tindakan ini akan membuat kueri Anda lebih cepat dengan membatasi daftar entity yang diambil oleh server saat memfilter hasil.
Pertimbangkan cuplikan kode berikut yang mengambil Grup Iklan berdasarkan ID-nya. Asumsikan bahwa ID kampanye induk diketahui.
Pendekatan coding | Cuplikan kode |
---|---|
Memfilter menurut ID kampanye dan grup iklan (direkomendasikan) |
var adGroup = AdsApp.adGroups() .withIds([12345]) .withCondition('CampaignId="54678"') .get() .next(); |
Memfilter hanya menurut ID grup iklan (kurang optimal) |
var adGroup = AdsApp.adGroups() .withIds([12345]) .get() .next(); |
Meskipun kedua cuplikan kode memberikan hasil yang sama, pemfilteran tambahan
dalam cuplikan kode 1 menggunakan ID induk (CampaignId="54678")
membuat
kode lebih efisien dengan membatasi daftar entity yang harus
di-iterasi server saat memfilter hasil.
Gunakan label ketika ada terlalu banyak kondisi pemfilteran
Bila Anda memiliki terlalu banyak kondisi pemfilteran, sebaiknya buat untuk entitas yang diproses, dan gunakan label tersebut untuk memfilter entitas.
Pertimbangkan cuplikan kode berikut yang mengambil daftar kampanye berdasarkan namanya.
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan label (direkomendasikan) |
var label = AdsApp.labels() .withCondition('Name = "My Label"') .get() .next(); var campaigns = label.campaigns.get(); while (campaigns.hasNext()) { var campaign = campaigns.next(); // Do more work } |
Membuat pemilih kompleks (tidak direkomendasikan) |
var campaignNames = [‘foo’, ‘bar’, ‘baz’]; for (var i = 0; i < campaignNames.length; i++) { campaignNames[i] = '"' + campaignNames[i] + '"'; } var campaigns = AdsApp.campaigns .withCondition('CampaignName in [' + campaignNames.join(',') + ']') .get(); while (campaigns.hasNext()) { var campaign = campaigns.next(); // Do more work. } |
Meskipun kedua cuplikan kode memberi Anda tingkat kinerja yang sama, kode kedua ini cenderung menghasilkan kode yang lebih kompleks karena jumlah kondisi dalam nilai pemilih Anda meningkat. Menerapkan label ke entitas baru juga lebih mudah daripada mengedit skrip untuk menyertakan entitas baru.
Membatasi jumlah kondisi dalam klausa IN
Saat menjalankan skrip, kasus penggunaan yang umum adalah menjalankan laporan untuk daftar entity. Developer biasanya melakukannya dengan membuat kueri AWQL yang sangat panjang yang memfilter ID entitas menggunakan klausa IN. Pendekatan ini berfungsi dengan baik jika jumlah entitas terbatas. Namun, karena panjang kueri Anda meningkat, kinerja skrip Anda menurun karena dua alasan:
- Kueri yang lebih panjang memerlukan waktu lebih lama untuk diurai.
- Setiap ID yang Anda tambahkan ke klausa IN adalah kondisi tambahan yang akan dievaluasi, sehingga memerlukan waktu lebih lama.
Dalam kondisi seperti itu, disarankan untuk menerapkan label pada entitas, dan
lalu filter menurut LabelId
.
Pendekatan coding | Cuplikan kode |
---|---|
Menerapkan label dan memfilter menurut labelID (direkomendasikan) |
// The label applied to the entity is "Report Entities" var label = AdsApp.labels() .withCondition('LabelName contains "Report Entities"') .get() .next(); var report = AdsApp.report('SELECT AdGroupId, Id, Clicks, ' + 'Impressions, Cost FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE LabelId = "' + label.getId() + '"'); |
Buat kueri panjang menggunakan klausa IN (tidak direkomendasikan) |
var report = AdsApp.report('SELECT AdGroupId, Id, Clicks, ' + 'Impressions, Cost FROM KEYWORDS_PERFORMANCE_REPORT WHERE ' + 'AdGroupId IN (123, 456) and Id in (123,345, 456…)'); |
Pemberitahuan akun
Perubahan batch
Saat Anda membuat perubahan pada entitas Google Ads, skrip Google Ads tidak akan langsung menjalankan perubahan tersebut. Sebaliknya, ia mencoba untuk menggabungkan beberapa perubahan ke dalam batch, sehingga dapat mengeluarkan satu permintaan yang melakukan beberapa perubahan. Pendekatan ini membuat skrip Anda lebih cepat dan mengurangi beban pada server Google Ads. Namun, ada beberapa pola kode yang memaksa skrip Google Ads untuk sering membersihkan batch operasinya, sehingga menyebabkan skrip Anda berjalan perlahan.
Pertimbangkan skrip berikut yang memperbarui bid daftar kata kunci.
Pendekatan coding | Cuplikan kode |
---|---|
Memantau elemen yang diperbarui (direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 50') .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .forDateRange('LAST_MONTH') .get(); var list = []; while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(1.5); list.push(keyword); } for (var i = 0; i < list.length; i++) { var keyword = list[i]; Logger.log('%s, %s', keyword.getText(), keyword.bidding().getCpc()); } |
Mengambil elemen yang diperbarui dalam loop yang ketat (tidak direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 50') .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(1.5); Logger.log('%s, %s', keyword.getText(), keyword.bidding().getCpc()); } |
Pendekatan kedua tidak direkomendasikan karena panggilan ke
keyword.bidding().getCpc()
memaksa skrip Google Ads untuk menghapus operasi setCpc()
dan hanya menjalankan satu operasi pada satu waktu. Pendekatan pertama, meskipun mirip dengan pendekatan kedua, memiliki manfaat tambahan untuk mendukung pengelompokan karena panggilan getCpc()
dilakukan dalam loop terpisah dari loop tempat setCpc()
dipanggil.
Gunakan builder jika memungkinkan
Skrip Google Ads mendukung dua cara untuk membuat objek baru—builder dan metode pembuatan. Builder lebih fleksibel daripada metode pembuatan, karena memberi Anda akses ke objek yang dibuat dari panggilan API.
Pertimbangkan cuplikan kode berikut:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan builder (direkomendasikan) |
var operation = adGroup.newKeywordBuilder() .withText('shoes') .build(); var keyword = operation.getResult(); |
Menggunakan metode pembuatan (tidak direkomendasikan) |
adGroup.createKeyword('shoes'); var keyword = adGroup.keywords() .withCondition('KeywordText="shoes"') .get() .next(); |
Pendekatan kedua tidak disukai karena operasi pemilihan tambahan yang terlibat dalam pengambilan kata kunci. Selain itu, metode pembuatan juga tidak digunakan lagi.
Namun, perlu diingat bahwa builder, jika digunakan dengan tidak benar, dapat mencegah Google Skrip iklan dari pengelompokan operasinya.
Pertimbangkan cuplikan kode berikut yang membuat daftar kata kunci, dan mencetak ID kata kunci yang baru dibuat:
Pendekatan coding | Cuplikan kode |
---|---|
Memantau elemen yang diperbarui (direkomendasikan) |
var keywords = [‘foo’, ‘bar’, ‘baz’]; var list = []; for (var i = 0; i < keywords.length; i++) { var operation = adGroup.newKeywordBuilder() .withText(keywords[i]) .build(); list.push(operation); } for (var i = 0; i < list.length; i++) { var operation = list[i]; var result = operation.getResult(); Logger.log('%s %s', result.getId(), result.getText()); } |
Mengambil elemen yang diperbarui dalam loop yang ketat (tidak direkomendasikan) |
var keywords = [‘foo’, ‘bar’, ‘baz’]; for (var i = 0; i < keywords.length; i++) { var operation = adGroup.newKeywordBuilder() .withText(keywords[i]) .build(); var result = operation.getResult(); Logger.log('%s %s', result.getId(), result.getText()); } |
Pendekatan kedua tidak direkomendasikan karena memanggil operation.getResult()
dalam loop yang sama yang membuat operasi, sehingga memaksa skrip Google Ads untuk menjalankan satu operasi dalam satu waktu. Meskipun serupa, pendekatan pertama memungkinkan pengelompokan karena kita memanggil operation.getResult() dalam loop yang berbeda dengan tempat pembuatannya.
Pertimbangkan untuk menggunakan upload massal untuk update besar
Tugas umum yang dilakukan developer adalah menjalankan laporan dan memperbarui properti entity (misalnya, bid kata kunci) berdasarkan nilai performa saat ini. Kapan
Anda harus memperbarui sejumlah besar entitas, upload massal cenderung memberi Anda
performa yang lebih baik. Misalnya, pertimbangkan skrip berikut yang meningkatkan
CPC Maks. kata kunci dengan TopImpressionPercentage > 0.4
kata kunci selama sebulan terakhir:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan upload massal (direkomendasikan) |
var report = AdsApp.report( 'SELECT AdGroupId, Id, CpcBid FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE TopImpressionPercentage > 0.4 DURING LAST_MONTH'); var upload = AdsApp.bulkUploads().newCsvUpload([ report.getColumnHeader('AdGroupId').getBulkUploadColumnName(), report.getColumnHeader('Id').getBulkUploadColumnName(), report.getColumnHeader('CpcBid').getBulkUploadColumnName()]); upload.forCampaignManagement(); var reportRows = report.rows(); while (reportRows.hasNext()) { var row = reportRows.next(); row['CpcBid'] = row['CpcBid'] + 0.02; upload.append(row.formatForUpload()); } upload.apply(); |
Memilih dan memperbarui kata kunci berdasarkan ID (kurang optimal) |
var reportRows = AdsApp.report('SELECT AdGroupId, Id, CpcBid FROM ' + 'KEYWORDS_PERFORMANCE_REPORT WHERE TopImpressionPercentage > 0.4 ' + ' DURING LAST_MONTH') .rows(); var map = { }; while (reportRows.hasNext()) { var row = reportRows.next(); var adGroupId = row['AdGroupId']; var id = row['Id']; if (map[adGroupId] == null) { map[adGroupId] = []; } map[adGroupId].push([adGroupId, id]); } for (var key in map) { var keywords = AdsApp.keywords() .withCondition('AdGroupId="' + key + '"') .withIds(map[key]) .get(); while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(keyword.bidding().getCpc() + 0.02); } } |
Meskipun pendekatan kedua memberi Anda kinerja yang cukup baik, pendekatan pertama lebih disukai dalam kasus ini karena
Skrip Google Ads memiliki batas jumlah objek yang dapat diambil atau diperbarui dalam sekali proses, dan operasi pilih dan perbarui di pendekatan kedua akan diperhitungkan dalam batas tersebut.
Upload massal memiliki batas lebih tinggi dalam hal jumlah entitas yang dapat update, dan waktu eksekusi secara keseluruhan.
Mengelompokkan upload massal menurut kampanye
Saat Anda membuat upload massal, cobalah untuk mengelompokkan operasi Anda berdasarkan kampanye. Hal ini meningkatkan efisiensi dan mengurangi kemungkinan perubahan yang bertentangan/error serentak.
Pertimbangkan dua tugas upload massal yang berjalan secara paralel. Satu menjeda iklan dalam sebuah iklan group; dan pihak lainnya menyesuaikan bid kata kunci. Meskipun tidak terkait, operasi dapat berlaku untuk entity dalam grup iklan yang sama (atau dua grup iklan yang berbeda dalam kampanye yang sama). Jika ini terjadi, sistem akan mengunci parent entity (grup iklan atau kampanye bersama), sehingga menyebabkan upload massal tugas yang saling memblokir.
Skrip Google Ads dapat mengoptimalkan eksekusi dalam satu tugas upload massal, sehingga hal paling sederhana untuk dilakukan adalah menjalankan hanya satu tugas upload massal per akun di waktu tertentu. Jika Anda memutuskan untuk menjalankan lebih dari satu upload massal per akun, pastikan upload massal tersebut beroperasi pada daftar kampanye yang saling eksklusif (dan entitas turunannya) untuk performa yang optimal.
Pelaporan
Gunakan laporan untuk mengambil statistik
Saat Anda ingin mengambil sejumlah besar entitas beserta statistiknya, sering kali lebih baik menggunakan laporan daripada metode AdsApp standar. Penggunaan laporan lebih disarankan karena alasan berikut:
- Laporan memberikan performa yang lebih baik untuk kueri besar.
- Laporan tidak akan mencapai kuota pengambilan normal.
Bandingkan cuplikan kode berikut yang mengambil Klik, Tayangan, Biaya, dan Teks dari semua kata kunci yang menerima lebih dari 50 klik bulan lalu:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan laporan (direkomendasikan) |
report = AdsApp.search( 'SELECT ' + ' ad_group_criterion.keyword.text, ' + ' metrics.clicks, ' + ' metrics.cost_micros, ' + ' metrics.impressions ' + 'FROM ' + ' keyword_view ' + 'WHERE ' + ' segments.date DURING LAST_MONTH ' + ' AND metrics.clicks > 50'); while (report.hasNext()) { var row = report.next(); Logger.log('Keyword: %s Impressions: %s ' + 'Clicks: %s Cost: %s', row.adGroupCriterion.keyword.text, row.metrics.impressions, row.metrics.clicks, row.metrics.cost); } |
Menggunakan iterator Ads (tidak direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('metrics.clicks > 50') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); var stats = keyword.getStatsFor('LAST_MONTH'); Logger.log('Keyword: %s Impressions: %s ' + 'Clicks: %s Cost: %s', keyword.getText(), stats.getImpressions(), stats.getClicks(), stats.getCost()); } |
Pendekatan kedua tidak disukai karena mengulang kata kunci
dan mengambil statistik satu entitas dalam satu waktu. Laporan berperforma lebih cepat dalam hal ini
karena ia mengambil semua data dalam satu panggilan dan mengalirkannya sebagai
tidak diperlukan. Selain itu, kata kunci yang diambil dalam pendekatan kedua adalah
dihitung terhadap kuota skrip Anda untuk jumlah entitas yang diambil menggunakan
panggilan get()
.
Menggunakan penelusuran, bukan laporan
Metode laporan dibuat untuk infrastruktur lama, dan akan memberikan hasil dalam format datar meskipun Anda menggunakan GAQL. Ini berarti bahwa model itu harus mengubah hasil kueri agar sesuai dengan gaya lama, yang bukan didukung untuk semua kolom dan menambahkan overhead ke setiap panggilan.
Alih-alih, sebaiknya gunakan penelusuran untuk memanfaatkan semua fitur pelaporan Google Ads API baru.
Memilih GAQL daripada AWQL
Meskipun AWQL masih didukung dalam kueri laporan dan panggilan withCondition
,
kueri ini dijalankan melalui lapisan terjemahan yang tidak memiliki kompatibilitas penuh
dengan AWQL yang sebenarnya. Untuk memiliki kontrol penuh atas kueri Anda, pastikan Anda
menggunakan GAQL.
Jika Anda memiliki kueri AWQL yang ingin diterjemahkan, kami memiliki Alat Migrasi untuk membantu.
Jangan memilih baris melebihi yang Anda butuhkan
Kecepatan eksekusi laporan (dan pemilih) didasarkan pada jumlah total baris yang akan ditampilkan dalam laporan, terlepas dari apakah Anda melakukan iterasi pada platform tersebut. Artinya, Anda harus selalu menggunakan filter tertentu untuk meminimalkan kumpulan hasil sebanyak mungkin agar sesuai dengan kasus penggunaan Anda.
Misalnya, Anda ingin mencari grup iklan dengan bid di luar beberapa rentang tertentu. Akan lebih cepat membuat dua kueri terpisah, satu untuk bid di bawah nilai minimum dan lainnya untuk bid di atas nilai minimum atas, mengambil semua grup iklan dan mengabaikan grup iklan yang tidak membuat Anda tertarik.
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan dua kueri (direkomendasikan) |
var adGroups = [] var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group WHERE ad_group.cpc_bid_micros < 1000000'); while (report.hasNext()) { var row = report.next(); adGroups.push(row.adGroup); } var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group WHERE ad_group.cpc_bid_micros > 2000000'); while (report.hasNext()) { var row = report.next(); adGroups.push(row.adGroup); } |
Memfilter ke bawah dari kueri umum (tidak direkomendasikan) |
var adGroups = [] var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group'); while (report.hasNext()) { var row = report.next(); var cpcBidMicros = row.adGroup.cpcBidMicros; if (cpcBidMicros < 1000000 || cpcBidMicros > 2000000) { adGroups.push(row.adGroup); } } |
Skrip Ad Manager (MCC)
Memilih executeInParallel daripada eksekusi serial
Saat menulis skrip untuk akun pengelola, gunakan executeInParallel()
, bukan
eksekusi serial jika memungkinkan. executeInParallel()
memberi skrip Anda lebih banyak waktu pemrosesan (hingga satu jam) dan hingga 30 menit per akun yang diproses (bukan 30 menit yang digabungkan untuk eksekusi serial). Lihat batas kami
untuk mengetahui detail selengkapnya.
Spreadsheet
Menggunakan operasi batch saat memperbarui spreadsheet
Saat memperbarui spreadsheet, coba gunakan metode pengoperasian massal
(misalnya, getRange()
) pada metode yang memperbarui sel satu per satu.
Perhatikan cuplikan kode berikut yang menghasilkan pola fraktal pada {i>spreadsheet<i}.
Pendekatan coding | Cuplikan kode |
---|---|
Memperbarui rentang sel dalam satu panggilan (direkomendasikan) |
var colors = new Array(100); for (var y = 0; y < 100; y++) { xcoord = xmin; colors[y] = new Array(100); for (var x = 0; x < 100; x++) { colors[y][x] = getColor_(xcoord, ycoord); xcoord += xincrement; } ycoord -= yincrement; } sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors); |
Perbarui sel satu per satu (tidak direkomendasikan) |
var cell = sheet.getRange('a1'); for (var y = 0; y < 100; y++) { xcoord = xmin; for (var x = 0; x < 100; x++) { var c = getColor_(xcoord, ycoord); cell.offset(y, x).setBackgroundColor(c); xcoord += xincrement; } ycoord -= yincrement; SpreadsheetApp.flush(); } |
Meskipun Google Spreadsheet mencoba mengoptimalkan cuplikan kode kedua dengan meng-cache nilai, performanya masih buruk dibandingkan dengan cuplikan pertama, karena jumlah panggilan API yang dilakukan.