我有一個私人測驗電子表格,它共享到 GAS 專案的服務帳戶電子郵件。下邊是:
使用帶有服務帳戶 oAuth2 憑據的 UrlFetchApp 從該電子表格“獲取”資料的功能。(Fetch 具有 Range 值:“'sName'!A1:B3”;作業表具有第 1 行列標題:A - “uId”;B - “title”)。它適用于與服務帳戶電子郵件共享(具有編輯權限)的電子表格。如果沒有該共享,它會因缺乏授權而失敗。因此,oAuth 憑據似乎是正確的,具有電子表格的范圍。(我正在使用Spencer Easton 的此代碼為服務帳戶生成 oAuth clientToken。)
用于更新(發布、放置、修補)同一測驗電子表格的功能。這三種方法都失敗了,但有不同的錯誤訊息,如下所示:
放置:“收到無效的 JSON 有效負載。未知名稱“標題”:無法系結查詢引數。在請求訊息中找不到欄位“標題”。” 如果 contentType:'application/json' 包含在選項中,則錯誤更改為:“收到無效的 JSON 有效負載。意外的令牌。\nuId=id3&title=Update\n^”(獲取 updateRange 值:“'sName'!A3:B3 " 或 "'名字'!A4:B4")
帖子:“/v4/spreadsheets/[actual ssId]/values/'sName'!A4:B4在此服務器上找不到請求的 URL。這就是我們所知道的。”
補丁:與 Post 相同,updateRange= "'sName'!A3:B3"
我瀏覽了與這些錯誤相關的 SO Q&A 帖子。有人說問題是在選項中包含 contentType (或 Content-Type: 在標題中)。如上所述,這并沒有解決問題,但確實使用“put”方法更改了錯誤訊息。Google UrlFetchApp 檔案說更新不需要它(所以下面顯示它被注釋掉了)。
我希望我只是在使用 UrlFetchApp 正確配置范圍或更新選項時忽略了一些基本的東西。
感謝您在通過更新解決此問題方面提供的任何指導。
- GET DATA -- 正確檢索資料
function getData(ssId,range) {
if (!clientToken) { return "Authorization Failed";}
var url= `https://sheets.googleapis.com/v4/spreadsheets/${ssId}/values/${range}`
var options = {
method: 'get',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' clientToken }
};
response = UrlFetchApp.fetch(url,options);
return response;
} //end getData function
var fetchData = getData(ssId,range);
- 更新資料——post、put和patch的錯誤
更新資料物件:var updateData = {'uId':'id3', 'title':'Update Title'}
function postData(ssId,updateRange,updateData) {
if (!clientToken) {return "Authorization Failed";}
var url= `https://sheets.googleapis.com/v4/spreadsheets/${ssId}/values/${updateRange}`
var options = {
// contentType: 'application/json',
valueInputOption: 'RAW',
method: 'put', //patch, post, or put
payload: updateData,
headers: { Authorization: 'Bearer ' clientToken }
};
var response= UrlFetchApp.fetch(url,options);
var responseCode = response.getResponseCode();
var responseBody = response.getContentText();
if (responseCode === 200) {
var responseJson = JSON.parse(responseBody);
return responseJson;
} else {
Logger.log(Utilities.formatString("Request failed. Expected 200, got %d: %s", responseCode, responseBody))
return responseCode;
}
} //end postData function
var dataUpdate = postData(ssId,updateRange,updateData);
uj5u.com熱心網友回復:
不幸的是,我無法確認您要在第二個腳本中使用的方法。但是,從您的端點來看,我猜您可能想要“方法:電子表格.values.update”。參考
如果我的理解是正確的,
var updateData = {'uId':'id3', 'title':'Update Title'}該方法不能直接使用。- 沒有
valueInputOptionin 的屬性UrlFetchApp.fetch()。
如果標題行在“A”和“B”列中有uIdandtitle并且您想將id3andUpdate Title的值放入updateRange,那么以下修改如何?
從:
var url= `https://sheets.googleapis.com/v4/spreadsheets/${ssId}/values/${updateRange}`
var options = {
// contentType: 'application/json',
valueInputOption: 'RAW',
method: 'put', //patch, post, or put
payload: updateData,
headers: { Authorization: 'Bearer ' clientToken }
};
到:
// var updateData = [['uId', 'title'], ['id3', 'Update Title']]; // If you want to include the header row, please use this.
var updateData = {values: [['id3', 'Update Title']]};
var url = `https://sheets.googleapis.com/v4/spreadsheets/${ssId}/values/${updateRange}?valueInputOption=RAW`;
var options = {
contentType: 'application/json',
method: 'put',
payload: JSON.stringify(updateData),
headers: { Authorization: 'Bearer ' clientToken }
};
筆記:
- 我認為,如果您的訪問令牌可用于將值放入 Google 電子表格,則此修改后的腳本可以作業。
參考:
- 方法:電子表格.values.update
- 獲取(網址,引數)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442354.html
標籤:谷歌应用脚本 谷歌表格 谷歌表格 API 服务帐户
上一篇:從列中獲取資料并將其粘貼到一行中
