- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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 版本做错了什么?
感谢任何帮助!
最佳答案
根据你的问题,我了解到你的情况是这样的。
1tWV6ELJEGkWkSXvdf9kQemvH-tDVTx0od4JHht2ZBeU
的Spreadsheet的容器绑定(bind)脚本中.Anyone with the link
的 editor
.Execute the app as: User accessing the web apps
和 Who has access to the app: Anyone
.这个答案假设我的上述理解。所以当我的理解不正确时,请告诉我。
UrlFetchApp
, 当 payload:'nothing'
使用时,即使在 method:'GET'
时,它也会请求作为 POST 方法用来。请注意这一点。https://www.googleapis.com/auth/spreadsheets
.在这种情况下,首先,需要通过自己的浏览器(每个用户的浏览器)授权范围。如果不这样做,即使脚本和具有客户端范围的访问 token 正确,也会出现 Authorization needed
错误发生。请注意这一点。这似乎是当前的规范。test1
到test4
)是您问题中的脚本,则范围是https://www.googleapis.com/auth/script.external_request
和 https://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)到你的情况后,就变成了这样。
在这种情况下,我认为您的设置可以使用。请将 Web 应用程序重新部署为新版本以防万一。并且请再次确认Web Apps的URL。
请访问https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec
使用自己的浏览器(用户端)。请授权 Web 应用程序的范围。
我想提议修改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.
}
请运行 test4()
.通过这个,0
从 Web Apps 返回,您可以在日志中看到它。
关于google-apps-script - 从另一个 Apps Script 项目运行 Apps Script Web App 时如何以编程方式进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64858395/
我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行,我感到很困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcal
我正在处理一个元组列表,如下所示: res = [('stori', 'JJ'), ('man', 'NN'), ('unnatur', 'JJ'), ('feel', 'NN'), ('pig',
最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码: threads = [] for machine, user, data
假设我有一个名为 user_stats 的资源,其中包含用户拥有的帖子、评论、喜欢和关注者的数量。是否有一种 RESTful 方式只询问该统计数据的一部分(即,对于 user_stats/3,请告诉我
我有一个简单的 api,它的工作原理是这样的: 用户创建一个请求 ( POST /requests ) 另一个用户检索所有请求 ( GET /requests ) 然后向请求添加报价 ( POST /
考虑以下 CDK Python 中的示例(对于这个问题,不需要 AWS 知识,这应该对基本上任何构建器模式都有效,我只是在这个示例中使用 CDK,因为我使用这个库遇到了这个问题。): from aws
Scala 中管理对象池的首选方法是什么? 我需要单线程创建和删除大规模对象(不需要同步)。在 C++ 中,我使用了静态对象数组。 在 Scala 中处理它的惯用和有效方法是什么? 最佳答案 我会把它
我有一个带有一些内置方法的类。这是该类的抽象示例: class Foo: def __init__(self): self.a = 0 self.b = 0
返回和检查方法执行的 Pythonic 方式 我目前在 python 代码中使用 golang 编码风格,决定移动 pythonic 方式 例子: import sys from typing imp
我正在开发一个 RESTful API。其中一个 URL 允许调用者通过 id 请求特定人员的记录。 返回该 id 不存在的记录的常规值是什么?服务器是否应该发回一个空对象或者一个 404,或者其他什
我正在使用 pathlib.Path() 检查文件是否存在,并使用 rasterio 将其作为图像打开. filename = pathlib.Path("./my_file-name.tif") 但
我正在寻找一种 Pythonic 方式来从列表和字典创建嵌套字典。以下两个语句产生相同的结果: a = [3, 4] b = {'a': 1, 'b': 2} c = dict(zip(b, a))
我有一个正在操裁剪理设备的脚本。设备有时会发生物理故障,当它发生时,我想重置设备并继续执行脚本。我有这个: while True: do_device_control() device
做组合别名的最pythonic和正确的方法是什么? 这是一个假设的场景: class House: def cleanup(self, arg1, arg2, kwarg1=False):
我正在开发一个小型客户端服务器程序来收集订单。我想以“REST(ful)方式”来做到这一点。 我想做的是: 收集所有订单行(产品和数量)并将完整订单发送到服务器 目前我看到有两种选择: 将每个订单行发
我知道在 Groovy 中您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */ String meth = "get" Foo."$meth"(1) 有没有办法
在 ECMAScript6 中,您可以使用扩展运算符来解构这样的对象 const {a, ...rest} = obj; 它将 obj 浅拷贝到 rest,不带属性 a。 有没有一种干净的方法可以在
我有几个函数返回数字或None。我希望我的包装函数返回第一个不是 None 的结果。除了下面的方法之外,还有其他方法吗? def func1(): return None def func2(
假设我想设计一个 REST api 来讨论歌曲、专辑和艺术家(实际上我就是这样做的,就像我之前的 1312414 个人一样)。 歌曲资源始终与其所属专辑相关联。相反,专辑资源与其包含的所有歌曲相关联。
这是我认为必须经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,它可以作为参数传递一个开放资源(如文件或数据库连接对象),或者需要自己创建一个。如果函数需要自己打开文件,最佳实践通常
我是一名优秀的程序员,十分优秀!