如何访问我的谷歌应用程序脚本网络应用程序?

时间:2021-07-06 06:45:43

标签: google-apps-script

我编写了一个脚本来使用来自我的服务器的数据生成一个表单,并将其部署为一个 Web 应用程序。该脚本位于谷歌标准项目中,处于开发状态,指定特定用户进行测试。指示了正确的范围,并成功生成了用户的凭据。但是,按照 "execute a function" 的指南,我总是遇到错误:{"error": {"code": 404, "message": "Requested entity was not found.", "status": "NOT_FOUND"} }.以下是我的代码:

在 code.js 中:

function doGet(e){
  Logger.log('doGet is called');
  var params = JSON.stringify(e);
  Logger.log('params: '+params);
  var mywork = params.parameters['mywork'];
  var formName = params.parameter['formName'];
  var subject = params.parameter['subject'];
  var result = makeQuestionsForm(mywork, formName, subject);
  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}

function doPost(e){
  Logger.log('doPost is called');
  var params = JSON.stringify(e);
  Logger.log('params: '+params);
  var mywork = params.parameters['mywork'];
  var formName = params.parameter['formName'];
  var subject = params.parameter['subject'];
  var result = makeQuestionsForm(mywork, formName, subject);
  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}

function makeQuestionsForm(mywork, formName, subject) {
  // code for generating the form
}

我调用脚本的代码:

service = build('script', 'v1', credentials=self.creds)
parameters = {'mywork':self.sheet_body,'subject':request.session['subject'],'formName':title}
api_request = {
            "function": "doPost",
            "parameters": parameters, 
            "devMode": True
}
response = service.scripts().run(body=api_request,
                scriptId=SCRIPT_ID).execute()

我做了很多尝试:将函数指定为“doPost”、“doGet”或“makeQuestionsForm”,将 scriptId 指定为项目的 id 或脚本的 id。所有人都得到了“NOT_FOUND”结果。

或者,我尝试使用 urlopen 方法直接调用脚本的 url,并在请求标头处提供令牌。未经授权。

你能帮忙看看我做错了什么或遗漏了什么吗?谢谢

2 个答案:

答案 0 :(得分:0)

这是我用来从 gmail 插件访问 web 应用程序的函数:

function deleteBlackList() {
  const url=Utilities.formatString('%s?mode=dable',burl());
  const params={"muteHttpExceptions":true,"method":"get","headers": {"Authorization": "Bearer " +  ScriptApp.getOAuthToken()}};
  const resp=UrlFetchApp.fetch(url,params);
  const ts=Utilities.formatDate(new Date(), "redacted", "E MMM dd,yyyy HH:mm:ss");
  Logger.log(url);
  Logger.log(resp.getContentText("UTF-8"));
  var action=CardService.newAction().setFunctionName('buildEmailFilterUI');  
  return CardService.newCardBuilder()
  .setHeader(CardService.newCardHeader().setTitle('Deleted BlackListed Emails')).addSection(CardService.newCardSection()
  .addWidget(CardService.newTextParagraph().setText(Utilities.formatString('TimeStamp: %s\n%s\n',ts,resp.getContentText()))))
  .addSection(CardService.newCardSection().addWidget(CardService.newTextButton().setText('Return to Opening Form').setOnClickAction(action)))
  .build();
}

burl 是 url 的 exec 版本,我只是将它硬连接到插件中。

答案 1 :(得分:0)

我发现了问题。要执行功能,必须将项目部署为 API 可执行文件。它被部署为网络应用程序,这就是为什么它没有被发现。将项目部署为 api 可执行文件后,现在,我可以访问该功能。虽然目前权限被拒绝,但这是另一个问题。