簡體   English   中英

Google電子表格應用腳本庫是否可以包含用戶對話框?

[英]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秒]

客戶端正在進行調用,但在到達電子表格腳本之前有些事情失敗了。

這讓我想知道是否

  1. 我需要做一些不同的代碼才能使代碼充當庫。
  2. 庫不能有對話框。
  3. 有一個服務器錯誤。

在此先感謝您的任何建議。

通過執行以下操作,我能夠擁有一個包含HTML對話框的工作庫。

  1. 將腳本和HTML文件從原始電子表格移動到獨立腳本項目。 File> Project properties ...Info選項卡中記下庫的Project鍵 任何打算使用該庫的電子表格都需要它。

  2. 如果其他人使用獨立腳本項目,請單擊其“ 共享”按鈕以使其可以與具有鏈接的任何人共享,否則它將無聲地失敗。

  3. 如果HTML對話框需要回調庫函數(獲取或提交數據),則庫函數必須存在於使用庫的電子表格中,否則您將在瀏覽器的JavaScript控制台中收到錯誤消息。

  4. 在使用該庫的電子表格中: 工具>腳本編輯器...單擊資源>庫...。 在“包含的庫”對話框中,在“ 查找庫”文本框中輸入獨立項目的鍵,單擊“ 選擇” ,然后選擇相應的版本 ,根據需要更改“ 標識符”和“ 保存” Identifier值創建一個同名的對象,供電子表格的腳本用來調用庫函數。 就我而言,它是SignupFormResponsesSheet

  5. 在同一個腳本編輯器的代碼編輯器中,添加調用庫函數的包裝函數,包括將從HTML對話框中調用的任何函數。 我的庫有一個onOpen() ,它創建兩個菜單項來顯示HTML對話框,所以我添加了

 function onOpen() { SignupFormResponsesSheet.onOpen(); } function showMappingForm() { SignupFormResponsesSheet.showMappingForm(); } function showSubmitForm() { SignupFormResponsesSheet.showSubmitForm(); } 

  1. 我的HTML對話框有許多回調來獲取和提交數據,所以我沒有為每個函數編寫包裝函數,而是通過利用Apps Script將庫視為包含函數的對象的方式添加了一個函數來覆蓋所有這些函數。 第一個參數是一個命名要調用的庫函數的字符串。 任何其他參數都傳遞給庫函數。

 function runSignupFormResponseFunction(funcName, varargs) { return SignupFormResponsesSheet[funcName].apply(this, Array.prototype.slice.call(arguments, 1)); } 

  1. 由於在上述步驟3中確定的限制時,JavaScript的HTML對話框使用google.script.run調用runSignupFormResponseFunction時,它需要獲得或提交數據。 例如,它有兩個列表,這些列表使用來自庫的getRangeLabelsgetColumnExamples函數的動態填充(並且必須在另一個之前填充一個),因此代碼是

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM