【问题标题】:How can I access my google apps script web apps?如何访问我的谷歌应用脚​​本网络应用?
【发布时间】:2021-07-07 11:35:04
【问题描述】:

我编写了一个脚本来使用来自我的服务器的数据生成一个表单,并将其部署为一个 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,并在请求标头处提供令牌。未经授权。

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

【问题讨论】:

  • 你有没有通过调用一个简单的函数而不向它传递参数来做到这一点?
  • 嗨,Kessy,我刚试过,得到了同样的错误。顺便说一句,我还尝试部署以我或用户身份执行,使用与我的项目中相同的电子邮件来生成凭据。都得到了同样的错误。

标签: google-apps-script


【解决方案1】:

这是我用来从 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 版本,我只是将它硬连接到插件中。

【讨论】:

  • 嗨,库珀。感谢您分享您的代码。为什么要使用“muteHttpExceptions”:true?你试过没有那个吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多