ScriptApp.getService().getUrl() is generating a dev URL. How can I make it generate the exec production URL?
For those poor souls that get here, an expansion on J. G.'s comment: confirmed that the result of the getService().getURL() call is dependent on which URL (/exec or /dev) is accessed by the end-user.
There is also an explicit clarification on that (not sure if it was present before) in the method documentation, so it seems to be by-design:
If you are running the development mode web app, this returns the development mode URL.
Note that to get the correct URL you need to use a workaround suggested by Tanaike. When using it, remember that it requires a standard GCP to enable the Apps Script API (technically, you can use a default one for that, but it will only work for G Suite (Google Workspace) accounts with access to system-gsuite/apps-script/ resources).
An implementation of deployment getter would be:
const getDeployments = (options = {}) => {
const {
version = 1,
id = ScriptApp.getScriptId(),
token = ScriptApp.getOAuthToken(),
page = "",
size = 50,
type = "WEB_APP",
} = options;
const uri = `https://script.googleapis.com/v${version}/projects/${id}/deployments`;
const fullURI = `${uri}?pageSize=${size}${page ? `&pageToken=${page}` : ""}`;
const params = {
contentType: "application/json",
headers: {
Authorization: `Bearer ${token}`,
},
muteHttpExceptions: true,
method: "get",
};
const deps = [];
const response = UrlFetchApp.fetch(fullURI, params);
if (response.getResponseCode() !== 200) {
console.log(response.getContentText());
return deps;
}
const { deployments, nextPageToken } = JSON.parse(response.getContentText());
const requested = deployments.filter(({ entryPoints }) =>
entryPoints.some(({ entryPointType }) => entryPointType === type)
);
deps.push(...requested);
if (nextPageToken) {
deps.push(...getDeployments(options));
}
return deps;
};
After a successful response, check the entryPoints collection to get the deployment you need. Each entry point will have a webApp nested object - you are interested in the url property of it.