# Google Ads Scripts - Best Practices

> Detailed best practices with code examples for writing efficient, reliable Google Ads Scripts.

- Skill: `tools-only/google-ads-scripts-best-practices` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add tools-only/google-ads-scripts-best-practices`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tools-only/google-ads-scripts-best-practices/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tools-only (https://skillmd.com/u/tools-only)
- Updated: 2026-09-29
- Page: https://skillmd.com/skills/tools-only/google-ads-scripts-best-practices

---

# Google Ads Scripts - Best Practices

Detailed best practices with code examples for writing efficient, reliable Google Ads Scripts.

## 1. Use Batch Operations

Avoid individual API calls in loops. Instead, collect entities and perform batch operations:

```javascript
// Good - Batch collection
const keywords = AdsApp.keywords()
  .withCondition('keyword.quality_info.quality_score < 5')
  .get();

const toUpdate = [];
while (keywords.hasNext()) {
  toUpdate.push(keywords.next());
}

toUpdate.forEach(keyword => keyword.setMaxCpc(50000));
```

## 2. Filter with Conditions

Use `.withCondition()` to filter at the API level rather than in JavaScript:

```javascript
// Good - API-level filtering
const campaigns = AdsApp.campaigns()
  .withCondition('campaign.status = ENABLED')
  .withCondition('campaign.budget_information.budget_amount > 100000000')
  .get();
```

## 3. Handle Errors Gracefully

Always wrap operations in try-catch blocks and log errors:

```javascript
function safeOperation() {
  try {
    // Operation code
  } catch (error) {
    Logger.log('Error: ' + error.message);
    Logger.log('Stack: ' + error.stack);

    // Optionally email alert
    MailApp.sendEmail(
      Session.getEffectiveUser().getEmail(),
      'Ads Script Error',
      error.message
    );
  }
}
```

## 4. Respect Execution Limits

Scripts have a 30-minute execution timeout. For large accounts:

- Limit result sets with `.withLimit()`
- Process in batches
- Use early termination when needed

## 5. Convert Micros Correctly

Google Ads API uses micros (1/1,000,000) for currency values:

```javascript
const costMicros = stats.getCost();
const costCurrency = costMicros / 1000000;  // Convert to dollars/local currency

const bidCurrency = 5.00;  // $5.00
const bidMicros = bidCurrency * 1000000;  // 5000000 micros
```

## 6. Log Operations for Auditing

Maintain audit trails by logging changes to Google Sheets:

```javascript
function logChange(operation, entity, details) {
  const ss = SpreadsheetApp.openById('LOG_SHEET_ID');
  const sheet = ss.getSheetByName('Audit Log');
  sheet.appendRow([
    new Date(),
    operation,
    entity,
    JSON.stringify(details)
  ]);
}
```

