我是Apps脚本的新手,并试图了解使用另一个帐户在一个帐户中运行/触发脚本的基础知识。只是警告:我想在用户访问脚本而不是用户拥有脚本的情况下运行脚本,以便为用户访问分配运行时间。
但是,我遇到了以下问题。
从测试SpreadSheet(共享设置为Anyone With Link)开始,可以在脚本项目页面中编辑以下代码:
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 App,并将执行设置为用户访问并为任何人启用访问。在浏览器中手动输入以下链接,以当前时间填充A1单元格,并按预期显示“ 0”的页面,
https://script.google.com/macros/s/AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm/exec
如果我仍然使用创建测试SpreadSheet的帐户登录,则输入链接。
如果我在没有GSuite登录的情况下使用其他浏览器输入链接,则需要登录,这也是预期的。毕竟,每个Web App部署都需要一个G Suite帐户来运行脚本。
但是,当我尝试使用其他GSuite帐户和Apps Script项目触发脚本时,仍然遇到登录页面以及其他问题。在......之外
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)
doPost(e)
由于未更新单元格A1,因此没有测试触发脚本。
test1()
似乎遇到了登录页面。但是,与此同时,test1()
是通过登录的G Suite帐户执行的。
可能还值得注意的是,test3()
它能够访问相关的Google SpreadSheet文件。我也尝试致电,ScriptApp.getOAuthToken()
因为为什么不这样做。test4()
与的响应相同test1()
。
我不知道从哪里开始进行诊断test2()
。
如何解决登录页面?
特别是,是否有一种方法可以使该脚本在具有相关Google SpreadSheet的访问权限的情况下,由其他GSuite帐户访问,并由用户访问而不是拥有SpreadSheet的用户来执行?
POST版本在做什么?
任何帮助都是值得的!
从您的问题中,我了解到您的情况如下。
1tWV6ELJEGkWkSXvdf9kQemvH-tDVTx0od4JHht2ZBeU
。Anyone with the link
的editor
。Execute the app as: User accessing the web apps
和Who has access to the app: Anyone
。这个答案是我的以上理解的前提。因此,如果我的理解不正确,请告诉我。
UrlFetchApp
,payload:'nothing'
使用时,即使使用,它也要求作为POST方法method:'GET'
。请注意这一点。https://www.googleapis.com/auth/spreadsheets
。在这种情况下,首先,需要通过自己的浏览器(每个用户的浏览器)对范围进行授权。如果不这样做,即使脚本和具有客户端作用域的访问令牌正确,Authorization needed
也会发生错误。请注意这一点。看来这是当前的规范。test1
to test4
)是问题中的脚本,则范围为https://www.googleapis.com/auth/script.external_request
和https://www.googleapis.com/auth/spreadsheets
。我认为范围不足以请求Web Apps。例如,在这种情况下,请添加// DriveApp.getFiles()
到脚本编辑器。这样,https://www.googleapis.com/auth/drive.readonly
脚本编辑器会自动添加的范围,并且该范围可用于向Web Apps请求。另外,您可以使用的范围https://www.googleapis.com/auth/drive
。
https://www.googleapis.com/auth/script.external_request
和https://www.googleapis.com/auth/spreadsheets
,的错误Unauthorized
发生。当以上几点反映到您的情况时,它将变为以下情况。
在这种情况下,我认为可以使用您的设置。请以新版本重新部署Web Apps,以防万一。并再次确认Web Apps的URL。
请https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec
使用自己的浏览器(用户端)访问。并且请授权Web Apps的范围。
我想提出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返回,您可以在日志中看到它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句