【发布时间】:2023-03-27 20:49:01
【问题描述】:
我是 Apps 脚本的新手,并试图了解在一个帐户中使用另一个帐户运行/触发脚本的基础知识。需要注意的是:我想在用户访问脚本而不是拥有脚本的用户的情况下运行脚本——以便将运行时间分配给访问的用户。
然而,我遇到了以下问题。
从共享设置为任何人都可以编辑的测试电子表格开始,并且脚本项目页面中的以下代码:
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 应用程序,执行设置为用户访问权限,并为任何人启用访问权限。在浏览器中手动输入以下链接会按照预期将当前时间和页面显示为“0”的单元格 A1 填充,
https://script.google.com/macros/s/AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm/exec
如果我输入链接时仍然使用创建测试电子表格的帐户登录。
如果我在没有 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 电子表格文件。我也试过打电话给ScriptApp.getOAuthToken(),因为为什么不呢。 test4() 与 test1() 具有相同的响应。
我不知道从哪里开始诊断test2() 中遇到的错误。
如何绕过登录页面?
特别是,有没有办法让任何其他具有相关 Google 电子表格的访问权限的 GSuite 帐户可以访问该脚本,并由访问该电子表格的用户而不是拥有该电子表格的用户执行?
我在使用 POST 版本时做错了什么?
感谢任何帮助!
【问题讨论】:
-
要解决
test2()问题,如果您使用muteHttpExceptions,您可以从回复中获得更多信息 -
而且,我相信如果您在此处阅读答案:stackoverflow.com/q/64130847/4243927,您将知道如何在目标 Web 应用程序上授权调用方 Web 应用程序。如果有帮助,请告诉我。
-
@Aerials:感谢您回答我的问题!我确实尝试在链接的问题中以相同的方式添加身份验证令牌,但
headers: {Authorization:'Bearer '+ token}除外,我得到了相同的响应。 -
尝试只使用 doGet() 而不是 doPost();
标签: google-apps-script google-sheets web-applications