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.
How about this answer? Please think of this as just one of several possible answers.
If you are enabling V8 runtime, in the current stage, it seems that when V8 runtime is enabled, ScriptApp.getService().getUrl()
returns the dev URL like https://script.google.com/macros/s/###/dev
, and when V8 runtime is disabled, it returns the exec URL like https://script.google.com/macros/s/###/exec
. I think that this might be one of bugs for V8.
If you want to directly retrieve the exec URL with enabling V8, as the current workaround, how about retrieving it using the method of projects.deployments.list in Apps Script API? You can test it at "Try this API". Of course, this can be used with Google Apps Script.
If I misunderstood your situation and this was not the direction you want, I apologize.