ScriptApp.getService().getUrl() points to dev URL. How can I get it to point to exec production URL?

前端 未结 2 1210
攒了一身酷
攒了一身酷 2020-12-20 09:51

ScriptApp.getService().getUrl() is generating a dev URL. How can I make it generate the exec production URL?

2条回答
  •  佛祖请我去吃肉
    2020-12-20 10:06

    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.

提交回复
热议问题