[英]Can a Google Spreadsheet Apps Script library contain a user dialog?
Google Spreadsheets使用的Apps腳本庫中可能存在限制嗎? 具體來說,庫可以包含HTML對話框嗎?
我創建了一個電子表格腳本,添加了一個菜單項,向用戶顯示一個對話框。 它使用HtmlService.createHtmlOutputFromFile('mappingForm').setSandboxMode(HtmlService.SandboxMode.IFRAME)
如https://developers.google.com/apps-script/guides/html/communication中所述 。 HTML文件包含帶有jQuery的HTML,CSS和JavaScript。 它使用google.script.run
使用電子表格中的數據填充對話框並向其提交表單。
這一切都在原始電子表格中正常工作。
我需要使用多個電子表格才能使用相同的代碼,因此,我嘗試按照電子表格(而非圖書館)共享的Google電子表格腳本的一般概念來制作帶有電子表格模板和多個副本的主腳本。
我按照https://developers.google.com/apps-script/guide_libraries上的說明從原始電子表格創建了一個庫。 當另一個電子表格使用該庫時,我能夠顯示對話框,但是所有回調到服務器的回調(填充對話框或提交表單)都會失敗,並且google.script.run.withFailureHandler
在瀏覽器端捕獲錯誤google.script.run.withFailureHandler
作為具有屬性的Error
對象:
message: "We're sorry, a server error occurred. Please wait a bit and try again."
name: "ScriptError"
我已經在應用程序腳本中放置了Logger調用,以查看是否正在調用服務器端函數但是沒有一個被命中。 腳本編輯器的執行記錄顯示:
[14-12-27 19:38:05:340 PST]開始執行
[14-12-27 19:38:05:372 PST]執行失敗:很抱歉,發生了服務器錯誤。 請稍等一下再試一次。 [總運行時間0.0秒]
客戶端正在進行調用,但在到達電子表格腳本之前有些事情失敗了。
這讓我想知道是否
在此先感謝您的任何建議。
通過執行以下操作,我能夠擁有一個包含HTML對話框的工作庫。
將腳本和HTML文件從原始電子表格移動到獨立腳本項目。 在File> Project properties ...的Info選項卡中記下庫的Project鍵 。 任何打算使用該庫的電子表格都需要它。
如果其他人使用獨立腳本項目,請單擊其“ 共享”按鈕以使其可以與具有鏈接的任何人共享,否則它將無聲地失敗。
如果HTML對話框需要回調庫函數(獲取或提交數據),則庫函數必須存在於使用庫的電子表格中,否則您將在瀏覽器的JavaScript控制台中收到錯誤消息。
在使用該庫的電子表格中: 工具>腳本編輯器...單擊資源>庫...。 在“包含的庫”對話框中,在“ 查找庫”文本框中輸入獨立項目的鍵,單擊“ 選擇” ,然后選擇相應的版本 ,根據需要更改“ 標識符”和“ 保存” 。 Identifier值創建一個同名的對象,供電子表格的腳本用來調用庫函數。 就我而言,它是SignupFormResponsesSheet
。
在同一個腳本編輯器的代碼編輯器中,添加調用庫函數的包裝函數,包括將從HTML對話框中調用的任何函數。 我的庫有一個onOpen()
,它創建兩個菜單項來顯示HTML對話框,所以我添加了
function onOpen() { SignupFormResponsesSheet.onOpen(); } function showMappingForm() { SignupFormResponsesSheet.showMappingForm(); } function showSubmitForm() { SignupFormResponsesSheet.showSubmitForm(); }
function runSignupFormResponseFunction(funcName, varargs) { return SignupFormResponsesSheet[funcName].apply(this, Array.prototype.slice.call(arguments, 1)); }
runSignupFormResponseFunction
時,它需要獲得或提交數據。 例如,它有兩個列表,這些列表使用來自庫的getRangeLabels
和getColumnExamples
函數的動態填充(並且必須在另一個之前填充一個),因此代碼是 google.script.run .withFailureHandler(showError) .withSuccessHandler(function(ranges) { loadRanges(ranges); // once ranges are loaded, load columns google.script.run .withSuccessHandler(loadColumns) .withFailureHandler(showError) .runSignupFormResponseFunction("getColumnExamples"); }) .runSignupFormResponseFunction("getRangeLabels");
今天這對我有用。 我希望它適用於可能會發現這個問題的其他人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.