在本文中,我们将为您详细介绍异常:请求失败https://docs.google.com返回代码401截断的服务器响应:GoogleAppScript的相关知识,此外,我们还会提供一些关于AdobeL
在本文中,我们将为您详细介绍异常:请求失败 https://docs.google.com 返回代码 401截断的服务器响应:Google App Script的相关知识,此外,我们还会提供一些关于Adobe Lightroom Catalog API 返回代码+JSON、Firestore 获取所有文档并在 Google App Script Web App 上显示为 HTML 表格 示例脚本:结果:注意:参考:、getter 'docs' 被调用为 null接收者:null 尝试调用:docs、Google App Script Web App 未加载数据有时的有用信息。
本文目录一览:- 异常:请求失败 https://docs.google.com 返回代码 401截断的服务器响应:Google App Script
- Adobe Lightroom Catalog API 返回代码+JSON
- Firestore 获取所有文档并在 Google App Script Web App 上显示为 HTML 表格 示例脚本:结果:注意:参考:
- getter 'docs' 被调用为 null接收者:null 尝试调用:docs
- Google App Script Web App 未加载数据有时
异常:请求失败 https://docs.google.com 返回代码 401截断的服务器响应:Google App Script
如何解决异常:请求失败 https://docs.google.com 返回代码 401截断的服务器响应:Google App Script
我正在尝试借助谷歌工作表中的一些数据自动填充谷歌。 当我运行应该提交响应的 autoEntry 函数时,我收到一个截断的服务器错误。有什么帮助吗? 错误:异常:https://docs.google.com 的请求失败返回代码 401。截断的服务器响应:
function autoEntry() {
var ids = run();
var workBook = SpreadsheetApp.getActiveSpreadsheet();
var workSheet= workBook.getSheetByName("Sheet1");
var formUrl = ""
var formData = ""
var ackNowlegdement= "";
var covid_contact= "";
var travel = "";
var work_office_client = "";
var Line_of_service = "";
var grade = "";
var date_visit= "";
var time_est_arrival= "";
var time_est_departure= "";
var noOfRows = workSheet.getRange("J1").getdisplayValue();
for (i = 2; i <=noOfRows;i++){
ackNowlegdement=workSheet.getRange("A" + i).getdisplayValue();
covid_contact = workSheet.getRange("B" + i).getdisplayValue();
travel = workSheet.getRange("C" + i).getdisplayValue();
work_office_client = workSheet.getRange("D" + i).getdisplayValue();
Line_of_service = workSheet.getRange("E" + i).getdisplayValue();
grade = workSheet.getRange("F" + i).getdisplayValue();
date_visit = workSheet.getRange("G" + i).getdisplayValue();
time_est_arrival = workSheet.getRange("H" + i).getdisplayValue();
time_est_departure = workSheet.getRange("I" + i).getdisplayValue();
formUrl = "https://docs.google.com/forms/d/1ZBx7lxqwE2LDmPYL93U5cnRb_wBMjEz1J9he2JDUiQY/formResponse?&pageHistory=0,1,2,3,4,5,6,7,8,9,10"
formData ="&entry." + ids[0]+ "=" + ackNowlegdement +"&entry." + ids[1]+ "=" + covid_contact + "&entry." + ids[2]+ "=" + travel + "&entry." + ids[3]+ "=" + work_office_client + "&entry." + ids[4]+ "=" + Line_of_service + "&entry." + ids[5]+ "=" + grade +"&entry." + ids[6]+ "=" + date_visit+"&entry." + ids[7]+ "=" + time_est_arrival +"&entry." + ids[8]+ "=" + time_est_departure
var finalUrl = formUrl + formData
var options = {
"method" : "post"
};
var res =UrlFetchApp.fetch(finalUrl,options);
}
}
function getPreFillEntriesMap_(id){
var form = FormApp.openById(id);
var items = form.getItems();
var newFormResponse = form.createResponse();
var itms = [];
for(var i = 0; i < items.length; i++){
var response = getDefaultItemResponse_(items[i]);
if(response){
newFormResponse.withItemResponse(response);
itms.push({
id: items[i].getId(),entry: null,titile: items[i].getTitle(),type: "" + items[i].getType()
});
}
}
var ens = newFormResponse.toPrefilledUrl().split("&entry.").map(function(s){
return s.split("=")[0];
});
ens.shift();
return itms.map(function(r,i){
r.entry = this[i];
return r;
},ens);
}
function getDefaultItemResponse_(item){
switch(item.getType()){
case FormApp.ItemType.TEXT:
return item.asTextItem().createResponse("1");
break;
case FormApp.ItemType.MULTIPLE_CHOICE:
return item.asMultipleChoiceItem()
.createResponse(item.asMultipleChoiceItem().getChoices()[0].getValue());
break;
case FormApp.ItemType.CHECKBox:
return item.asCheckBoxItem()
.createResponse([item.asCheckBoxItem().getChoices()[0].getValue()]);
case FormApp.ItemType.DATETIME:
return item.asDateTimeItem()
.createResponse(new Date());
break;
case FormApp.ItemType.DATE:
return item.asDateItem()
.createResponse(new Date());
break;
case FormApp.ItemType.LIST:
return item.asListItem()
.createResponse(item.asListItem().getChoices()[0].getValue());
break;
case FormApp.ItemType.ParaGRAPH_TEXT:
return item.asParagraphTextItem().createResponse("some paragraph");
break;
case FormApp.ItemType.CHECKBox_GRID:
return item.asCheckBoxGridItem().createResponse([item.asGridItem().getColumns[0],item.asGridItem().getRows[0]]);
break;
case FormApp.ItemType.DURATION:
return item.asDurationItem().createResponse(2,20,20);
break;
case FormApp.ItemType.GRID:
return item.asGridItem().createResponse([item.asGridItem().getColumns[0],item.asGridItem().getRows[0]]);
break;
case FormApp.ItemType.SCALE:
return item.asScaleItem().asScaleItem().createResponse(1);
break;
case FormApp.ItemType.TIME:
Logger.log(item.asTimeItem())
return item.asTimeItem().createResponse(1,1);
break;
default:
return undefined;
}
}
function run(){
var obj= JSON.stringify(getPreFillEntriesMap_("1ZBx7lxqwE2LDmPYL93U5cnRb_wBMjEz1J9he2JDUiQY"),null," ");
Logger.log(obj)
var entries_id= [];
var stringify = JSON.parse(obj);
for (var i = 0; i < stringify.length; i++) {
// Logger.log(stringify[i][''entry''])
entries_id.push(stringify[i][''entry''])
}
return entries_id;
}
解决方法
不要尝试使用 HTML 前端发送响应,而是使用 Apps 脚本服务。为此,它的工作方式如下:
- 使用
from.createResponse()
创建新响应
- 为每个项目获取实际类型(使用
asXXX
方法),然后使用createResponse(value)
创建项目响应 - 添加每个项目响应,使用
response.withItemResponse(itemResponse)
将其添加到响应 - 使用
response.submit()
提交响应
参考文献
- Form.createResponse() (Apps Script reference)
- FormResponse.withItemResponse(response) (Apps Script reference)
- TextItem.createResponse(response) (Apps Script reference)
- FormResponse.submit() (Apps Script reference)
Adobe Lightroom Catalog API 返回代码+JSON
如何解决Adobe Lightroom Catalog API 返回代码+JSON
使用 Adobe Lightroom Catalog API 访问 Lightroom 帐户中的目录时,生成的数据是代码和 JSON 的组合,以:
while (1) {}\\n{\\"base\\":\\"https://lr.adobe.io/v2/\\",\\"id\\":\\"7afe....
这与仅指定 JSON 的文档不同。
我可以安全地修剪开头的“while (1) {}”吗
我是否应该修改我的请求
我还应该对 GET 响应字符串进行其他更改吗?
解决方法
是的,您可以安全地剪掉 while (1) {}
部分。
这只是一种防止隐藏在 json 结构中的恶意代码自动执行的安全措施。
不幸的是,这会使您的代码更加复杂。而不是一个简单的
const data = await fetch(''https://lr.adobe.io/v2'')
.then((response) => response.json());
你必须这样做:
const data = await fetch(''https://lr.adobe.io/v2'')
.then((response) => response.text())
.then((text) => text.replace(''while (1) {}'',''''))
.then((json) => JSON.parse(json.trim()));
Firestore 获取所有文档并在 Google App Script Web App 上显示为 HTML 表格 示例脚本:结果:注意:参考:
如何解决Firestore 获取所有文档并在 Google App Script Web App 上显示为 HTML 表格 示例脚本:结果:注意:参考:
提前致谢。
需要有关使用 FirestoreGoogleAppsScript 库的帮助。需要拉取所有文档并显示在 HTML 表格上。我能够使用 allDocumentsRows = firestore.getDocuments("StudentInfo");但我得到了一些数据,不知道如何解析,请看下面的结果。
再次非常感谢您
下面是我的 Firestore:
[{"name":"projects/aerobic-rampart-310908/databases/(default)/documents/StudentInfo/2kVWabLEOIklMjFjSx8Z","fields":{"Lname":{"stringValue":"Neman"},"Gender":{"stringValue":"Male"},"StudID":{"stringValue":"P1003"},"Fname":{"stringValue":"Mike"},"Age":{"stringValue":"30"}},"createTime":"2021-04-19T01:19:07.244542Z","updateTime":"2021-04-19T01:20:07.525386Z","readTime":"2021-04-19T04:49:08.022505Z"},{"name":"projects/aerobic-rampart-310908/databases/(default)/documents/StudentInfo/5alVKxcuefigpDJxVz42","fields":{"StudID":{"stringValue":"P1003"},"Lname":{"stringValue":"Neman"},"Age":{"stringValue":"30"},"Fname":{"stringValue":"Mike"}},"createTime":"2021-04-19T01:20:17.336285Z","updateTime":"2021-04-19T01:20:17.336285Z",{"name":"projects/aerobic-rampart-310908/databases/(default)/documents/StudentInfo/PUfVFCSSvb6Ocsg8GuL9","createTime":"2021-04-19T01:20:14.947172Z","updateTime":"2021-04-19T01:20:14.947172Z",{"name":"projects/aerobic-rampart-310908/databases/(default)/documents/StudentInfo/SKskdYQO6YQv0jPN16ma","fields":{"Age":{"stringValue":"30"},"StudID":{"stringValue":"P1003"}},"createTime":"2021-04-19T01:20:19.429915Z","updateTime":"2021-04-19T01:20:19.429915Z",{"name":"projects/aerobic-rampart-310908/databases/(default)/documents/StudentInfo/bWmpnwK5iuUuhJ5jEG6c","fields":{"Gender":{"stringValue":"Male"},"createTime":"2021-04-19T01:20:18.516428Z","updateTime":"2021-04-19T01:20:18.516428Z",{"name":"projects/aerobic-rampart-310908/databases/(default)/documents/StudentInfo/gpIqfyWpHJBNosJuOJSw","Gender":{"stringValue":"Male"}},"createTime":"2021-04-19T01:20:22.676022Z","updateTime":"2021-04-19T01:20:22.676022Z","readTime":"2021-04-19T04:49:08.022505Z"}]
解决方法
我相信你的目标如下。
- 您想从 Firestore 检索值,并且您想使用 Google Apps 脚本使用检索到的值创建 HTML 表。
当allDocumentsRows = firestore.getDocuments("StudentInfo")
的示例值为您问题中的值,标题行为["Age","Fname","Lname","StudID","Gender"]
时,示例脚本如下。
示例脚本:
const allDocumentsRows = firestore.getDocuments("StudentInfo"); // This script is from your question.
const headers = ["Age","Gender"]; // As the header row,please set the keys in fields with the order you want to use.
const h = headers.reduce((s,e) => s += `<th>${e}</th>`,"<tr>") + "</tr>";
const htmlTable = allDocumentsRows.reduce((s,{fields}) =>
s += headers.reduce((t,hed) => t += `<td>${fields[hed].stringValue}</td>`,"<tr>") + "</tr>",`<table>${h}`) + "</table>";
console.log(htmlTable)
结果:
当以上脚本用于您的样本值时,得到以下结果。
<table><tr><th>Age</th><th>Fname</th><th>Lname</th><th>StudID</th><th>Gender</th></tr><tr><td>30</td><td>Mike</td><td>Neman</td><td>P1003</td><td>Male</td></tr><tr><td>30</td><td>Mike</td><td>Neman</td><td>P1003</td><td>Male</td></tr><tr><td>30</td><td>Mike</td><td>Neman</td><td>P1003</td><td>Male</td></tr><tr><td>30</td><td>Mike</td><td>Neman</td><td>P1003</td><td>Male</td></tr><tr><td>30</td><td>Mike</td><td>Neman</td><td>P1003</td><td>Male</td></tr><tr><td>30</td><td>Mike</td><td>Neman</td><td>P1003</td><td>Male</td></tr></table>
注意:
- 当您要更改标题的顺序时,请修改
const headers = ["Age","Gender"]
。
参考:
- reduce()
getter 'docs' 被调用为 null接收者:null 尝试调用:docs
如何解决getter ''docs'' 被调用为 null接收者:null 尝试调用:docs
当我运行我的应用程序时,总是会出现一个错误:
The getter ''docs'' was called on null.
Receiver: null
Tried calling: docs
但一切正常,我该如何解决? 我认为 Flutter 有一个更新导致这段代码出错,因为我遇到了很多这样的问题。 我的代码中的重要部分:
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection(''medicine'')
.where(''userId'',isEqualTo: user.uid)
.snapshots(),builder: (context,snapshot) {
final doc = snapshot.data.docs;
return ListView.builder(
itemCount: doc.length,itemBuilder: (ctx,index) {
if (snapshot.data == null) {
return Center(
child: CircularProgressIndicator(),);
}
return Container(
child: Stack(
children: [
Row(
children: [
Flexible(
child: Column(
children: [
Text(
''اسم الدواء: '' + doc[index][''medicationName''],textAlign: TextAlign.start,),],)
],);
},));
解决方法
第一个流可以发出一个空快照。
您应该在访问文档之前检查快照是否有数据:
if(!snapshot.hasData) {
return Center(child: CircularProgressIndicator());
}
// if it has data,do your thing:
final doc = snapshot.data.docs;
return ListView( ..... )
,
使您的代码正常工作的另一种解决方案是使用 null safety 并将 snapshot.data 替换为 snapshot?.data
Google App Script Web App 未加载数据有时
如何解决Google App Script Web App 未加载数据有时
我正在制作一个 Google Script Web App,它会自动生成索引,并从电子表格中获取数据。
我目前在加载 Web 应用程序时遇到问题。有时下拉菜单中的数据未加载。这通常发生在下拉菜单被加载后迅速打开时。 我猜这是因为在从电子表格获取的数据加载到其中之前显示了一个下拉列表,导致下拉列表中的数据加载被“取消”。
我想知道是否有人有解决方案或知道为什么会发生这种情况,因为我的只是一个假设。
我的 GS 代码:
function doGet(e) {
return HtmlService.createHtmlOutputFromFile(''index1'');
}
const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Auto-Index");
const sectionsLenghtData = ss.getRange("E1").getValue();
const sectionsLenght = "A1:B"+sectionsLenghtData;
const procedLenghtData = ss.getRange("E2").getValue();
const procedLenght = "H1:N"+procedLenghtData;
//READS THE PHONE BRANDS
function readProcedSections() {
var data = ss.getRange(sectionsLenght).getValues();
Logger.log(data)
return data
}
//READS THE PHOnes
function readProcedData() {
var data = ss.getRange(procedLenght).getValues();
Logger.log(data)
return data
}
用 GS 读取的数据加载到这个 HTML
<!doctype html>
<html lang="en">
<head>
<base target="_top">
<!-- required Meta tags -->
<Meta charset="utf-8">
<Meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet">
<title>BIND - Procedimientos y Políticas</title>
<style>
body {
margin-left: 1rem;
margin-right: 1rem;
}
#loadingDiv {
background-color: #fff;
position: fixed;
width:100%;
height:100%;
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
}
#pills-load {
height: 30px;
width: 100px;
}
#loadingSpinner {
}
.navbar {
background-color: #fff;
padding-top: 1rem;
position: sticky;
top:0;
width:100%;
z-index:100;
}
.accordion-button:hover {
color: #0d6efd;
}
.search {
float: float;
width: 25%;
margin-left: 1rem;
}
#lupa {
margin-bottom: 0.3rem;
}
.nav {
float: left;
width: 73%;
}
.nav-link {
color: #343a40;
}
.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active {
font-weight: 600;
color: #0d6efd;
}
li {
list-style-type: none;
}
.accordion {
margin-bottom: 0.4rem;
margin-left:0.5rem;
margin-right: 0.5rem;
}
a {
display: block;
text-decoration: none;
margin-bottom: 0.3rem;
}
n1 {
}
.n2 {
font-size: 0.97rem;
}
.n3 {
font-size: 0.97rem;
}
.n4 {
font-size: 0.97rem;
}
.proced {
display: flex;
}
.material-icons {
margin-left: 0.8rem;
height: 1rem;
width: 1rem;
color: #343a40;
}
.material-icons:hover {
color:#0d6efd;
}
.sinHijos .material-icons {
display: none;
}
.cardn1 {
margin-left: 2.6rem;
}
.cardn2 {
margin-left: 2.6rem;
}
.cardn3 {
margin-left: 5.2rem;
}
.cardn4 {
margin-left: 7.8rem;
}
#listPoliticas {
margin-left: 1rem;
}
#index {
margin-top: 0.4rem;
}
</style>
<script>
</script>
</head>
<body>
<div class="navbar">
<ul class="nav nav-tabs">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="pills-proced" data-bs-toggle="pill" data-bs-target="#pills-proced" type="button" role="tab" aria-controls="pills-proced" aria-selected="true" onclick="showHideProcedimientos()">Procedimientos</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="pills-polit" data-bs-toggle="pill" data-bs-target="#pills-polit" type="button" role="tab" aria-controls="pills-polit" aria-selected="false" onclick="showHidePoliticas()">Políticas</button>
</li>
</ul>
<div class="search">
<form class="d-flex">
<input class="form-control me-2" id="inputsearch" type="search" placeholder="Buscar" aria-label="Buscar">
<button class="btn btn-primary" id="searchbutton" type="submit">
<svg id="lupa" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16">
<path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/>
</svg>
</button>
</form>
</div>
</div>
<div class="accordion accordion-flush" id="index">
</div>
<div class="accordion accordion-flush" id="politicas" style="display: none;">
<div class="card card-body">
<li id="listPoliticas">
</li>
</div>
</div>
<script>
function getProcedSections(values) {
var x = document.getElementById("index");
values.forEach(function(item) {
//x.innerHTML += ''<h2 id="''+ item[1] +''">''+ item[0] +''</h2>'';
x.innerHTML += ''<div/tag/ionitem/" target="_blank">ion-item"><h2/tag/dio/" target="_blank">dion-header" id="flush-heading"><button/tag/dio/" target="_blank">dion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse''+item[1]+''" aria-expanded="false" aria-controls="flush-collapse''+item[1]+''">''+ item[0] + ''</button></h2><div id="flush-collapse''+item[1]+''"/tag/dio/" target="_blank">dion-collapse collapse" aria-labelledby="flush-heading''+item[1]+''" data-bs-parent="#index"><div/tag/dio/" target="_blank">dion-body" id="''+item[1]+''"></div></div></div>''
});
}
google.script.run.withSuccessHandler(getProcedSections).readProcedSections();
function getProcedData(values) {
var x = document.getElementById("index");
values.forEach(function(item) {
var y = document.getElementById(item[4]);
y.innerHTML += ''<divpun">+item[6]+''"><apun">+ item[3] +'' link" href="''+item[2]+''" target="_blank">''+ item[1] +''</a><adata-bs-toggle="collapse" href="#''+item[5]+''" role="button" aria-expanded="false" aria-controls="collapse''+item[5]+''">keyboard_arrow_down</a></div><divpun">+item[3]+''" id="''+item[5]+''"></div>''
});
return;
}
google.script.run.withSuccessHandler(getProcedData).readProcedData();
function showHidePoliticas(){
document.getElementById("index").style.display="none";
document.getElementById("politicas").style.display="inline";
}
function showHideProcedimientos() {
document.getElementById("politicas").style.display="none";
document.getElementById("index").style.display="inline"
}
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJfdroafW" crossorigin="anonymous"></script>
</body>
</html>
这是 Web 应用程序和电子表格的链接。
https://script.google.com/macros/s/AKfycbz37hctjTKMHodsQh0JKqutxTsbasUj9WRRRxBNEtCb1nGoXm5GbZGKxg/exec
https://docs.google.com/spreadsheets/d/1-bKLOHzCOTx0E6LMR06h8qpNH8vxKVTBVz3srHVY_qQ/edit?usp=sharing
解决方法
在全局范围内调用电子表格服务不是一个好主意,因为每次函数被一个简单的触发器(如 doGet
、google.script.run
等)调用时,这些调用都会被执行。
另一方面,由于您需要下拉选项在显示后立即可用,因此最好不要在加载下拉列表之前读取下拉选项而在此之前执行。
有几种方法可以做到这一点。一种方法是使用 templated HTML 而不是立即提供 HTML。
如果您还不想学习使用模板化 HTML,您可以通过使用一次服务器端调用来检索您需要的所有值来提高您的网络应用程序的性能。
相关
- Display Spreadsheet data in Sites with Html Service
今天关于异常:请求失败 https://docs.google.com 返回代码 401截断的服务器响应:Google App Script的分享就到这里,希望大家有所收获,若想了解更多关于Adobe Lightroom Catalog API 返回代码+JSON、Firestore 获取所有文档并在 Google App Script Web App 上显示为 HTML 表格 示例脚本:结果:注意:参考:、getter 'docs' 被调用为 null接收者:null 尝试调用:docs、Google App Script Web App 未加载数据有时等相关知识,可以在本站进行查询。
本文标签: