gpt4 book ai didi

google-apps-script - 从另一个 Apps Script 项目运行 Apps Script Web App 时如何以编程方式进行身份验证

转载 作者:行者123 更新时间:2023-12-02 16:24:15 28 4
gpt4 key购买 nike

我是 Apps 脚本的新手,正在尝试了解使用另一个帐户在一个帐户中运行/触发脚本的基础知识。需要注意的是:我想在访问脚本的用户而不是拥有脚本的用户的情况下运行脚本——以便将运行时间分配给访问的用户。

但是我遇到了以下问题。


从一个测试 SpreadSheet 开始,将共享设置为任何有链接的人都可以编辑,并在脚本项目页面中添加以下代码:

function doPost(e){
var sheet = SpreadsheetApp.openById('1tWV6ELJEGkWkSXvdf9kQemvH-tDVTx0od4JHht2ZBeU');
var tab = sheet.getSheetByName('ref');
tab.getRange(1,1).setValue(new Date());
return ContentService.createTextOutput(0)
}

function doGet(e){
return doPost(e)
}

并将该项目发布为 Web 应用程序,执行设置为用户访问并为任何人启用访问权限。在浏览器中手动输入以下链接,用当前时间填充单元格 A1,页面显示“0”,如预期的那样,

https://script.google.com/macros/s/AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm/exec

IF 我输入链接时仍使用创建测试电子表格的帐户登录。

如果我在没有 GSuite 登录的情况下使用其他浏览器输入链接,我需要登录,这也是预期的。毕竟,每次部署 Web 应用程序都需要一个 G Suite 帐户来运行脚本。

但是,当我尝试使用不同的 GSuite 帐户和 Apps 脚本项目触发脚本时,我仍然遇到登录页面和其他问题。出

function test1(){
const scriptURL='https://script.google.com/macros/s/AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm/exec';
var response = UrlFetchApp.fetch(scriptURL)
Logger.log(response.getContentText())
}

function test2(){
const scriptURL='https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec';
var response = UrlFetchApp.fetch(scriptURL, {
method:'POST',
payload:'nothing'
});
Logger.log(response.getContentText())
}

function test3() {
var sheet = SpreadsheetApp.openById('AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm');
Logger.log(sheet.getName());
}

function test4() {
var token = ScriptApp.getOAuthToken();
const scriptURL='https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec';
var response = UrlFetchApp.fetch(scriptURL, {
headers: {Authorization:'Bearer '+ token},
method:'GET',
payload:'nothing'
});
Logger.log(response.getContentText())
}

test1() 在 Log 中生成一长串以

开头的文本
Logging output too large. Truncating output. 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta content="width=300, initial-scale=1" name="viewport">
<meta name="google-site-verification" content="LrdTUW9psUAMbh4Ia074-BPEVmcpBxF6Gwf0MSgQXZs">
<title>Sign in - Google Accounts</title>
<style>

test2()返回错误

Exception: Request failed for https://script.google.com returned code 401. Truncated server response: <!DOCTYPE html><html lang="en"><head><meta name="description" content="Web word processing, presentations and spreadsheets"><meta name="viewport" c... (use muteHttpExceptions option to examine full response)
at test2(Code:23:30)

由于单元格 A1 未更新,因此两个测试均未触发 doPost(e) 中的脚本。

test1() 好像遇到了登录页面。然而,与此同时,test1() 是通过登录 G Suite 帐户执行的。

可能还值得注意的是,test3() 能够访问相关的 Google SpreadSheet 文件。我还尝试调用 ScriptApp.getOAuthToken() 因为为什么不呢。 test4()test1() 的响应相同。

我不知道从哪里开始诊断 test2() 中遇到的错误。


如何绕过登录页面?

特别是,有没有办法让任何其他 GSuite 帐户访问该脚本,该帐户有权访问相关的 Google SpreadSheet 并由访问用户而不是拥有 SpreadSheet 的用户执行?

我对 POST 版本做错了什么?

感谢任何帮助!

最佳答案

根据你的问题,我了解到你的情况是这样的。

  • Web Apps的脚本被放入1tWV6ELJEGkWkSXvdf9kQemvH-tDVTx0od4JHht2ZBeU的Spreadsheet的容器​​绑定(bind)脚本中.
  • 电子表格共享为 Anyone with the linkeditor .
  • Web 应用程序部署为 Execute the app as: User accessing the web appsWho has access to the app: Anyone .

这个答案假设我的上述理解。所以当我的理解不正确时,请告诉我。

修改点:

  • UrlFetchApp , 当 payload:'nothing'使用时,即使在 method:'GET' 时,它也会请求作为 POST 方法用来。请注意这一点。
  • 在您的 Web Apps 脚本中使用范围 https://www.googleapis.com/auth/spreadsheets .在这种情况下,首先,需要通过自己的浏览器(每个用户的浏览器)授权范围。如果不这样做,即使脚本和具有客户端范围的访问 token 正确,也会出现 Authorization needed 错误发生。请注意这一点。这似乎是当前的规范。
  • 如果您客户端的整个脚本(test1test4)是您问题中的脚本,则范围是https://www.googleapis.com/auth/script.external_requesthttps://www.googleapis.com/auth/spreadsheets .我认为范围不足以请求 Web 应用程序。在这种情况下,例如,请添加 // DriveApp.getFiles()到脚本编辑器。由此,https://www.googleapis.com/auth/drive.readonly的范围由脚本编辑器自动添加,此范围可用于向 Web 应用程序发出请求。此外,您可以使用 https://www.googleapis.com/auth/drive 的范围.
    • 对于 https://www.googleapis.com/auth/script.external_request 的范围和 https://www.googleapis.com/auth/spreadsheets ,错误 Unauthorized发生。

以上几点反射(reflect)到你的情况后,就变成了这样。

用法:

1。准备 Web 应用程序端。 (服务器端)

在这种情况下,我认为您的设置可以使用。请将 Web 应用程序重新部署为新版本以防万一。并且请再次确认Web Apps的URL。

2。准备客户端。

  1. 请访问https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec使用自己的浏览器(用户端)。请授权 Web 应用程序的范围。

  2. 我想提议修改test4()你的脚本如下。

     function test4() {
    var token = ScriptApp.getOAuthToken();
    const scriptURL='https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec';
    var response = UrlFetchApp.fetch(scriptURL, {
    headers: {Authorization:'Bearer '+ token},
    method: 'GET',
    // payload:'nothing',
    muteHttpExceptions: true
    });
    Logger.log(response.getContentText())

    // DriveApp.getFiles() // This is used for adding a scope of https://www.googleapis.com/auth/drive.readonly. This is used for requesting to Web Apps.
    }
  3. 请运行 test4() .通过这个,0从 Web Apps 返回,您可以在日志中看到它。

引用资料:

关于google-apps-script - 从另一个 Apps Script 项目运行 Apps Script Web App 时如何以编程方式进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64858395/

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