gpt4 book ai didi

javascript - 如何在 Web 界面中授权应用程序脚本?

转载 作者:行者123 更新时间:2023-12-02 23:53:59 25 4
gpt4 key购买 nike

我有一个简单的应用程序脚本,它在驱动器中搜索名为“something”的文件夹,并列出其中的文件名称(如果该文件夹不存在,则会创建该文件夹)。

function doGet() {
var folders = DriveApp.getFoldersByName('something');
if (folders.hasNext()) {
var files = folders.next().getFiles();
var fileNames = [];
while (files.hasNext()) {
var file = files.next();
fileNames.push(file.getName())
};
return ContentService.createTextOutput(JSON.stringify({
'status': 'success',
'output': fileNames
}))

} else {
DriveApp.createFolder('something');
return ContentService.createTextOutput(JSON.stringify({
'status': 'success',
'output': 'folder created'
}))
}
}

我将脚本部署为 Web 应用程序,像我自己一样执行该应用程序,使用浏览器中的 React 应用程序的 fetch 调用对其进行测试,一切都按预期工作。

然后,我将其重新发布为 Web 应用程序,并以访问该 Web 应用程序的用户身份执行。这次没有任何效果。我在浏览器中收到以下错误

Access to fetch at 'https://script.google.com/macros/s/AKfycbx4eQ60DziUy4hSjnJidW9WVwBsT_qruQHa_BrK508T4oD9ILY/exec' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

由于没有身份验证,我预计会出现错误。我在 React 应用程序上设置了 google OAuth2,添加了脚本和驱动范围,在 google 开发者控制台中注册了应用程序并设置了所有内容,以便我获得一个 accessToken ,我可以通过 fetch 在 header 中发送它调用 Google 脚本。

但我仍然遇到与上面相同的错误。

我应该如何授权应用程序脚本应用程序以便任何人都可以运行它?

我正在尝试创建一个带有 google 登录按钮的网络应用程序,当用户登录时调用我部署的 appscript 并在其驱动器中搜索文件夹命名“某物”,以便我可以在网络应用程序中显示文件的名称。

这不是 cors 问题,如果我以自己的身份执行 Web 应用程序,则不存在 cors 问题,并且对代码进行零更改。我的问题是关于如何授权应用程序脚本?我只提到 cors 错误,因为我正在展示到目前为止我所尝试的内容。

最佳答案

如果调用中的任何函数抛出异常,您将收到 CORS 错误,因为您没有 try...catch 处理程序。当部署 webapp fails to return a valid response (i.e. either an HtmlOutput or TextOutput) ,Google 的错误页面不包含任何 CORS header 。

为了防止这些“掩盖”CORS 错误,请使用 try...catch 封装您的 Web 应用入口点,以便报告实际错误。

即使没有使用 try...catch 包装 Web 应用程序的入口点,您也很可能能够通过查看项目的 Stackdriver 日志/Stackdriver 错误报告来访问底层错误。

这是一个简单的示例,演示了一些事件对象验证,以确保请求来自您关心的地方并且格式良好,然后调用一个可能会因无效/未经授权的操作引发异常的函数。无论哪种情况,它都会返回一个不透明的面向用户的响应(“抱歉!”),并且对于错误将生成 Stackdriver 日志。它无法捕获因执行时间配额违规而发生的异常,因为您的脚本只是被终止。

function doGet(e) {
if (!e || !validate_(e)) {
return fail_();
}
try {
return walkDriveContent(...);
}
catch (err) {
console.error({message: "Drive walk failed: " + err.message, stack: err.stack, error: err});
return fail_();
}
}

function fail_() {
return ContentService.createTextOutput("Sorry!");
}

function validate_(eventObj) {
/** your code here that ensures this is a valid event object you can work with */
// return true;
// or
// return false;
}

function walkDriveContent(folderName) {
/**
* Your code that may throw exceptions here, but otherwise
* returns TextOutput or HtmlOutput
*/
}

关于javascript - 如何在 Web 界面中授权应用程序脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55494796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com