Hi, can anyone helps to fix the Google ads script below? Why are cost, Avg. CPC ($) and Cost/Conv ($) Data remain 0 in the excel after I ran the Google Ads Script:
function main() {
const SPREADSHEET_URL = '
https://docs.google.com/spreadsheets/d/1cnx7GO3UCxmgurb3GU_dDK1w9nIZ2_INznp-C5iv1Uw/edit';
const sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheetByName('Sheet1');
// Clear existing content
sheet.clear();
const timeZone = AdsApp.currentAccount().getTimeZone();
const today = new Date();
const formattedDate = Utilities.formatDate(today, timeZone, "yyyy-MM-dd");
// Add debugging log
Logger.log("Starting report generation for date: " + formattedDate);
const report = AdsApp.report(
'SELECT CampaignName, Impressions, Clicks, Ctr, Cost, AverageCpc, Conversions, ' +
'ConversionRate, CostPerConversion, ConversionValue ' +
'FROM CAMPAIGN_PERFORMANCE_REPORT ' +
'DURING LAST_7_DAYS'
);
const rows = report.rows();
// Add debugging log
Logger.log("Report query executed, processing rows...");
sheet.appendRow(['']);
sheet.appendRow(['Report Date', formattedDate]);
sheet.appendRow([
'Campaign Name', 'Impressions', 'Clicks', 'CTR (%)', 'Cost ($)', 'Avg. CPC ($)',
'Conversions', 'Conversion Rate (%)', 'Cost/Conv ($)', 'Conv. Value ($)'
]);
let rowCount = 0;
while (rows.hasNext()) {
const row = rows.next();
rowCount++;
// Debug log for each row
Logger.log("Processing row " + rowCount + ": " + row['CampaignName']);
// Debug specific fields
Logger.log("Raw Cost value: " + row['Cost']);
Logger.log("Raw ConversionValue: " + row['ConversionValue']);
const campaignName = row['CampaignName'] ? row['CampaignName'].toLowerCase() : '';
const impressions = parseInt(row['Impressions']) || 0;
const clicks = parseInt(row['Clicks']) || 0;
// Skip irrelevant campaigns
if (
(impressions === 0 && clicks === 0) ||
campaignName.includes('test') ||
campaignName.includes('remarketing') ||
campaignName.includes('rm') ||
campaignName.includes('xx')
) {
Logger.log("Skipping campaign: " + campaignName);
continue;
}
// Improved value handling functions
function safeNumber(value) {
if (value === undefined || value === null || value === '--') return '';
return parseFloat(value) || 0;
}
function formatCurrency(value, isMicro = false) {
if (value === '' || isNaN(value)) return '';
const num = isMicro ? (parseFloat(value) / 1000000) : parseFloat(value);
return num.toFixed(2);
}
function safePercent(value) {
if (!value || value === '--') return '';
// Handle percentage values with or without % symbol
const cleanValue = value.toString().replace('%', '');
return parseFloat(cleanValue).toFixed(2);
}
// Get raw values first
const rawCost = row['Cost'];
const rawCpc = row['AverageCpc'];
const rawCostPerConv = row['CostPerConversion'];
const rawConvValue = row['ConversionValue'];
// Process values
const cost = formatCurrency(safeNumber(rawCost), true);
const cpc = formatCurrency(safeNumber(rawCpc), true);
const costPerConv = formatCurrency(safeNumber(rawCostPerConv), true);
// ConversionValue might be in micro-units or regular units depending on account settings
// Try both ways and use the one that makes more sense
const convValueRegular = formatCurrency(safeNumber(rawConvValue), false);
const convValueMicro = formatCurrency(safeNumber(rawConvValue), true);
// Choose the most likely correct value (non-zero if possible)
const convValue = (parseFloat(convValueRegular) > 0) ? convValueRegular :
(parseFloat(convValueMicro) > 0) ? convValueMicro :
rawConvValue ? formatCurrency(safeNumber(rawConvValue), true) : '';
// Debug processed values
Logger.log("Processed Cost: " + cost);
Logger.log("Processed ConversionValue: " + convValue);
sheet.appendRow([
row['CampaignName'],
impressions,
clicks,
safePercent(row['Ctr']),
cost,
cpc,
formatCurrency(safeNumber(row['Conversions']), false),
safePercent(row['ConversionRate']),
costPerConv,
convValue
]);
}
// Add summary log
Logger.log("Report generation complete. Processed " + rowCount + " rows.");
// Add a note about debugging
sheet.appendRow(['']);
sheet.appendRow(['Note:', 'If data is still missing, check the Logs in Google Ads Scripts editor for debugging information.']);
}