我想我的問題是雙重的:doGet()在以下背景關系中,將在 0.1~0.2 秒后失敗而不發布日志,所以我不知道如何自己解決它。此外,如果我讓腳本代表我執行,我是否必須將帶有授權令牌的請求推送到比作業表名稱更“相關”的區域,例如迭代本身?進一步閱讀以了解更多詳情:
我有一個源電子表格,我在其中交叉參考用戶輸入的資料以驗證我們“存檔”的資訊。我們的大多數客戶都超過 55 歲,所以我試圖通過讓腳本在他們需要使用時代表我運行來降低最終用戶的復雜性(繞過授權螢屏,帶有可怕的“這個應用程式可以不安全!”訊息)。我讀到的方法似乎是 with doGet(),所以我設定了一個低級 HTTP Get 請求,它只doGet()用我的 OAuth 令牌推送一個,回傳作業表名稱。我還專門設定了一個屏蔽函式來執行此操作,并將其鏈接到最初用于迭代邏輯的按鈕。doGet()看起來像這樣:
const doGet = e => {
Logger.log(`Recieved HTTP request.`);
const content = ContentService.createTextOutput(iterator(e));
Logger.log(content);
return content;
}
并且使用的按鈕UrlFetchApp如下所示:
const runMask = () => {
const active = SpreadsheetApp.getActiveSheet().getSheetName();
const v4 = 'https://script.google.com/macros/s/<scriptid>/dev' // ScriptApp.getService().getUrl() posts 404
UrlFetchApp.fetch(`${v4}?sheetName='${active}'`, {
headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` },
});
我在真實環境中設定了一些日志,這些日志一直持續runMask()到程式結束,給了我真實的 URL 和 OAuth 令牌,所以我知道它可以順利通過runMask()。但是,doGet()即使在函式的頂部,日志也不會發布任何內容。我可以在我的執行日志中看到它正在執行觸發器,但日志本身仍然是空的。
我試過了:
- 使用
ScriptApp.getService().getUrl()代替v4:日志中的帖子 404 帶有截斷的服務器回應 - 用作業表的名稱替換
${active}:同樣的問題;logging${active}還回傳作業表的正確名稱。
除此之外,我什至不知道該怎么做。我的所有范圍都正確(auth/spreadsheets.currentonly、auth/script.external_request和auth/userinfo.email),并且我對操作安全性沒有任何問題(因為電子表格和腳本都是由我撰寫的,因此客戶無需授予對其整個驅動器的訪問權限)。在嘗試實作doGet()和繞過授權螢屏之前,迭代器本身作業得很好。因此,我選擇不在此處包含它,因為它幾乎不相關(執行迭代函式的函式永遠不會達到這一點)。
我知道這是大量的資訊;我很樂意根據需要提供更多資訊或背景關系。
uj5u.com熱心網友回復:
獲取 ReferenceError:未定義迭代器(第 12 行,檔案“ag2”)
有了這個:
const doGet = e => {
Logger.log(`Recieved HTTP request.`);
const content = ContentService.createTextOutput(iterator(e));
Logger.log(content);
return content;
}
使用 url/exec?option=A 發布
它運行
const doGet = e => {
Logger.log(`Recieved HTTP request.`);
const content = ContentService.createTextOutput(JSON.stringify(e));
Logger.log(content);
return content;
}
并回傳適當的字串化物件
uj5u.com熱心網友回復:
僅使用測驗 URL ( /dev) 從 Web 瀏覽器測驗 Web 應用程式。
在使用版本化部署 ( /exec) 從 Web 瀏覽器獲取之前,請記住發布新版本。
將 Google Cloud 專案分配給您的 Google Apps 腳本專案。有關詳細資訊,請參閱https://developers.google.com/apps-script/guides/cloud-platform-projects。
為了更容易地除錯您避免從 Google Apps 腳本方法呼叫函式,例如createTextOutput,將函式結果分配給變數并將其用作方法引數,即替換
const content = ContentService.createTextOutput(iterator(e));
經過
const something = iterator(e);
const content = ContentService.createTextOutput(something);
出于除錯目的,創建一個函式來呼叫您的 doGet 函式,并檢查它是否運行沒有任何問題,即
function __test__doGet(){
const e = {
parameter: {}
}
doGet(e);
}
有關的
- 谷歌應用程式腳本網路應用程式中的例外處理
uj5u.com熱心網友回復:
問題:
當我看到你的問題時,我很擔心I have everything scoped correctly (auth/spreadsheets.currentonly, auth/script.external_request, and auth/userinfo.email)。
如果您僅在oauthScopesof處使用以下范圍appsscript.json,
https://www.googleapis.com/auth/spreadsheets.currentonlyhttps://www.googleapis.com/auth/script.external_requesthttps://www.googleapis.com/auth/userinfo.email
不幸的是,這些范圍不能用于訪問 Web 應用程式。雖然我不確定運行你的函式的方法runMask,但我認為這可能是你的問題的原因。
解決方案:
如果您想https://script.google.com/macros/s/<scriptid>/dev使用通過 檢索到的訪問令牌訪問 Web 應用程式ScriptApp.getOAuthToken(),請包括以下范圍。
https://www.googleapis.com/auth/drive.readonly
或者
https://www.googleapis.com/auth/drive
包含上述范圍后,請重新授權范圍,并再次測驗。當你的函式iterator已經被宣告并且腳本運行時,通過運行runMask,你可以看到Logger.log(Recieved HTTP request 的日志。)并Logger.log(content)在日志中。
參考:
- 使用 Google Apps 腳本利用 Web Apps
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479333.html
