-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain_looker.js
150 lines (116 loc) · 4.8 KB
/
main_looker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// This script is almost identical to the main.js with the only difference that is optimised to work
// with data visualisation platforms, in this case Looker Studio.
////////////////////////////////////////////////////////////////////
// CONFIGURATIONS
var config = {
LOG: false,
DATE_RANGE: last_n_days(30), // Choose the amount of days for data retrieval
SPREADSHEET_URL: "", // Only include URL until /edit.
EMAIL_ADDRESSES: "", // Add email address for email alert.
SHEET_NAME: "PMAX Search Terms" // !DO NOT CHANGE THIS AS IT WILL BREAK THE LOOKER DASHBOARD!
};
////////////////////////////////////////////////////////////////////
// ***DO NOT CHANGE THE CODE BELOW***
function main() {
// Campaign Selection and SQL Query
var spreadsheet = SpreadsheetApp.openByUrl(config.SPREADSHEET_URL);
let campaignIterator = AdsApp
.performanceMaxCampaigns()
.withCondition("campaign.status = ENABLED")
.get();
while (campaignIterator.hasNext()) {
let campaign = campaignIterator.next();
let query = AdsApp.report(
"SELECT campaign_search_term_insight.category_label, metrics.clicks, metrics.impressions, metrics.conversions, metrics.conversions_value " +
"FROM campaign_search_term_insight " +
"WHERE campaign_search_term_insight.campaign_id = '" + campaign.getId() + "' " +
"AND segments.date BETWEEN '" + config.DATE_RANGE.split(',')[0] + "' AND '" + config.DATE_RANGE.split(',')[1] + "' " +
"ORDER BY metrics.impressions DESC"
);
if (config.LOG === true) {
Logger.log("Report " + campaign.getName() + " contains " + query.rows().totalNumEntities() + " rows.");
}
let sheet = getOrCreateSheet(spreadsheet, config.SHEET_NAME);
sheet.clear();
query.exportToSheet(sheet);
} // campaignIterator
// Send Email Functionality
var recipientEmails = config.EMAIL_ADDRESSES.split(',');
var subject = "PMAX Search Terms Report [UK]";
var body =
"The PMAX Search Terms Report has been generated and is available at: " +
config.SPREADSHEET_URL +
"\n\nReport covers the last " +
config.DATE_RANGE +
" days." +
"\n\nThis is an automated email sent by Google Ads Script.";
MailApp.sendEmail(recipientEmails.join(','), subject, body);
}
////////////////////////////////////////////////////////////////////
// Create Spreadsheet
function getOrCreateSheet(spreadsheet, sheetName) {
var sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
sheet = spreadsheet.insertSheet(sheetName);
}
return sheet;
}
////////////////////////////////////////////////////////////////////
// Spreadsheet Formatting
function formatSheet(sheet) {
Logger.log("Starting formatSheet function");
if (!sheet) {
Logger.log("Error: The sheet object is not valid.");
return;
}
Logger.log("Sheet name: " + sheet.getName());
Logger.log("Sheet rows: " + sheet.getLastRow() + ", columns: " + sheet.getLastColumn());
var headerRange = sheet.getRange(1, 1, 1, sheet.getLastColumn());
Logger.log("Header Range: " + headerRange.getA1Notation());
headerRange.setFontWeight('bold');
headerRange.setBackground('#4caf50');
headerRange.setFontColor('white');
if (sheet.getLastRow() > 1) {
var dataRange = sheet.getRange(2, 2, sheet.getLastRow() - 1, sheet.getLastColumn() - 1);
Logger.log("Data Range: " + dataRange.getA1Notation());
dataRange.setNumberFormat('#,##0');
var conversionValueRange = sheet.getRange(2, 5, sheet.getLastRow() - 1, 1);
Logger.log("Conversion Value Range: " + conversionValueRange.getA1Notation());
conversionValueRange.setNumberFormat('£#,##0.00');
var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());
Logger.log("Row Banding Range: " + range.getA1Notation());
range.applyRowBanding(SpreadsheetApp.BandingTheme.LIGHT_GREY);
} else {
Logger.log("No data rows found to apply formatting.");
}
sheet.autoResizeColumns(1, sheet.getLastColumn());
Logger.log("Completed formatSheet function");
}
////////////////////////////////////////////////////////////////////
// Date Range Logic
function last_n_days(n) {
var from = new Date();
var to = new Date();
to.setDate(to.getDate() - n);
from.setDate(from.getDate() - 1);
return google_date_range(to, from);
} // function last_n_days()
function google_date_range(from, to) {
function google_format(date) {
var date_array = [
date.getUTCFullYear(),
(date.getUTCMonth() + 1).toString().padStart(2, '0'),
date.getUTCDate().toString().padStart(2, '0')
];
return date_array.join('');
}
var inverse = (from > to);
from = google_format(from);
to = google_format(to);
var result = [from, to];
if (inverse) {
result = [to, from];
}
return result.join(',');
} // function google_date_range()
////////////////////////////////////////////////////////////////////