在对公众竞争时,我没有运气从Google表格API的v4获得回复(即"发布到网络"并与#34共享;网络上的任何人" #34;)电子表格。
相关文件说明:
"如果请求不需要授权( ,例如公共数据请求 ),则应用程序必须提供API密钥或者OAuth 2.0令牌,或者两者兼而有之 - 对您来说最方便的选项。"
要提供API密钥,文档说明:
"获得API密钥后,您的应用程序可以将查询参数key = yourAPIKey附加到所有请求网址。"
因此,我应该能够在以下网址的公开电子表格中找到列出工作表的回复:
https://sheets.googleapis.com/v4/spreadsheets/ {spreadsheetId}?键= {myAPIkey}
(显然,分别在路径和查询字符串中提供了id和密钥)
然而,当我这样做时,我收到了HTTP 401响应:
{
error: {
code: 401,
message: "The request does not have valid authentication credentials.",
status: "UNAUTHENTICATED"
}
}
其他任何人都能让这个对公共工作簿起作用吗?如果没有,那么从谷歌那边监控这个主题的人是否可以评论或提供工作样本?
答案 0 :(得分:11)
我设法让这个工作。即使我一开始感到沮丧。而且,这不是一个错误。以下是我的表现方式:
-Google Apps脚本执行API
-Google Sheets API
注意:确保您在GDC中使用的Google帐户必须与您在电子表格项目中使用的帐户相同,否则您可能会收到"The API Key and the authentication credential are from different projects"
错误消息。
https://www.googleapis.com/auth/spreadsheets
范围,以便拥有机器人读写权限。注意:确保您的网址请求是Spreadsheetv4 docs中指明的网址。
这是我的示例网址请求:
https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?includeGridData=false
我收到HTTP/1.1 200 OK
并显示了我要求的数据。这适用于所有Spreadsheetv4服务器端进程。
希望这有帮助。
答案 1 :(得分:6)
我们最近解决了这个问题,它现在应该可行了。对不起,请再试一次。
该文件必须与“有链接的任何人”或“网上公开”共享。 (注意:与“v3 API”不同,“文件 - >发布到网络”中的发布设置无关紧要。)
答案 2 :(得分:1)
这不是问题的解决方案,但我认为这是实现目标的好方法。在网站http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/,我找到了如何使用Google Apps脚本更新电子表格。这是GET方法的一个例子。我将尝试向您展示使用JSON格式的POST方法。
如何发布: 在标签工具>中创建Google电子表格。脚本编辑器粘贴以下脚本。通过输入相应的电子表格ID和工作表标签名称(脚本中的第27行和第28行)修改脚本。
function doPost(e)
{
var success = false;
if (e != null)
{
var JSON_RawContent = e.postData.contents;
var PersonalData = JSON.parse(JSON_RawContent);
success = SaveData(
PersonalData.Name,
PersonalData.Age,
PersonalData.Phone
);
}
// Return plain text Output
return ContentService.createTextOutput("Data saved: " + success);
}
function SaveData(Name, Age, Phone)
{
try
{
var dateTime = new Date();
// Paste the URL of the Google Sheets starting from https thru /edit
// For e.g.: https://docs.google.com/---YOUR SPREADSHEET ID---/edit
var MyPersonalMatrix = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---YOUR SPREADSHEET ID---/edit");
var MyBasicPersonalData = MyPersonalMatrix.getSheetByName("BasicPersonalData");
// Get last edited row
var row = MyBasicPersonalData.getLastRow() + 1;
MyBasicPersonalData.getRange("A" + row).setValue(Name);
MyBasicPersonalData.getRange("B" + row).setValue(Age);
MyBasicPersonalData.getRange("C" + row).setValue(Phone);
return true;
}
catch(error)
{
return false;
}
}
现在保存脚本并转到标签发布>部署为Web App 。
执行应用程序: Me xyz@gmail.com ,
谁有权访问该应用:任何人,甚至匿名
或使用UWP:
private async void Button_Click(object sender, RoutedEventArgs e)
{
using (HttpClient httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(@"https://script.google.com/");
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("utf-8"));
string endpoint = @"/macros/s/---YOUR SCRIPT ID---/exec";
try
{
PersonalData personalData = new PersonalData();
personalData.Name = "Jarek";
personalData.Age = "34";
personalData.Phone = "111 222 333";
HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(personalData), Encoding.UTF8, "application/json");
HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(endpoint, httpContent);
if (httpResponseMessage.IsSuccessStatusCode)
{
string jsonResponse = await httpResponseMessage.Content.ReadAsStringAsync();
//do something with json response here
}
}
catch (Exception ex)
{
}
}
}
public class PersonalData
{
public string Name;
public string Age;
public string Phone;
}
以上代码NuGet Newtonsoft.Json是必需的。
答案 3 :(得分:0)
如果您的供稿是公开的,并且您使用的是api键,请确保您抛出了http GET请求。如果是POST请求,则会收到此错误。 我也面对过 使用获取数据 方法:sheets.getByDataFilter具有POST请求