Most Google Ads entities expose a `getId()` method that returns their
identifier. While not strictly necessary in most cases, IDs may come in handy
when

Working with [reports](https://developers.google.com/google-ads/scripts/docs/concepts/reports)
:   IDs provide a good way to link a report row to the actual Google Ads entity.

Maintaining a mapping with an external datastore
:   You may already have ID-based information stored in your own database.

Looking for a bit of a performance boost

:   Fetching by IDs is often quicker than alternatives. The code for fetching a
    single entity is a bit easier too:

        let campaigns = AdsApp.campaigns()
           .withIds([678678])
           .get();
        // versus
        let campaigns = AdsApp.campaigns()
           .withCondition("Name='My Campaign'")
           .get();

## Uniqueness

Campaign IDs and ad group IDs are unique: no two campaigns or ad groups will
ever share the same ID. Ads and keywords, however, have composite IDs: a unique
identifier of a keyword is a combination of its ad group ID and keyword ID.
Likewise, a unique identifier of an ad is a combination of its ad group ID and
ad ID. This has implications for the way `selector.withIds()` is called.

For campaigns and ad groups, `selector.withIds()` expects an array of numbers:

    let ids = [123123, 234234, 345345];
    let campaignSelector = AdsApp.campaigns().withIds(ids);

For ads and keywords, however, `selector.withIds()` needs an array of
two-element arrays, the first element being the ad group ID. The following
snippet retrieves three keywords from an ad group:

    let adGroupId = 123123;
    let keywordSelector = AdsApp.keywords().withIds([
        [adGroupId, 234234],
        [adGroupId, 345345],
        [adGroupId, 456456]
    ]);

The same construct applies when fetching ads.

## Temporary IDs

When working with a [mutate request](https://developers.google.com/google-ads/scripts/docs/concepts/mutate)
with multiple operations, you'll occasionally need to use
[temporary IDs](https://developers.google.com/google-ads/api/docs/batch-processing/temporary-ids) to link
resources to each other, since the full resource names won't be available until
you get the API response. Temporary IDs must be negative numbers starting with
-1, and cannot repeat within the same mutate request. In order to use temporary
IDs effectively, you'll have to write some code to ensure that you don't create
duplicate temporary IDs:

    let nextId = -1;

    function getNextTempId() {
        const ret = nextId;
        nextId -= 1;
        return ret;
    }

Each successive call to `getNextTempId` will return a number one less than the
previous. Since all temp IDs must be negative, start at -1.

Temporary IDs are not remembered across jobs or mutate requests. To reference a
resource created in a previous mutate request, use its actual resource name.