2012-11-02 26 views
1

我試圖從電子表格上的Google應用程序腳本表單向專用緩存保存一些用戶輸入。從服務器處理程序使用緩存

下面是測試腳本:

var cache = CacheService.getPrivateCache(); 

function onLoad() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(), 
     entries = [{ 
     name : "Show form", 
     functionName : "showForm" 
     }]; 
    sheet.addMenu("Test Menu", entries); 
} 

function showForm() { 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(), 
     app = UiApp.createApplication(), 
     setButton = app.createButton("Set"), 
     setHandler = app.createServerClickHandler('setTest'); 

    setButton.addClickHandler(setHandler); 
    app.add(setButton); 
    spreadsheet.show(app); 
} 

function setTest(event) { 
    cache.put("test", "test", 7200); 

    Browser.msgBox("Test was set: " + cache.get("test") + ". Use the getTest cell formula to test the cache."); 
} 

function getTest() { 
    var result = cache.get("test"); 

    return result; 
} 

當我點擊菜單鍵,會出現一個表格,並設置在服務器處理器的高速緩存值。然後我嘗試在單元格中使用= getTest()從緩存中獲取值。我期望緩存返回值「測試」,但它似乎返回null。

我開始在這裏這個問題: http://code.google.com/p/google-apps-script-issues/issues/detail?id=2039

而且我還發現了另一個類似的一個: http://code.google.com/p/google-apps-script-issues/issues/detail?id=1804

試圖保存表單上的一些用戶輸入到緩存中,並能夠從另一個訪問功能在晚些時候。

有什麼建議嗎?

+0

消息框顯示正確的值嗎? – Srik

+0

如果您正在討論彈出的msgBox確認緩存值確實是從setTest函數設置的,那麼確實是這樣。 – adrianb

回答

0

定製功能的範圍有限,然後只能訪問一些選擇的服務。你讀了更多關於他們的限制here

隨着緩存它有點棘手 - 緩存是每個「腳本範圍」。因此,當首先從服務器處理程序腳本訪問緩存時,它將其作爲具有更多特權並與自定義函數運行的腳本作用域不同的UiApp運行。因此,這兩個作用域之間不共享緩存。

您可以從其他自定義函數訪問您在自定義函數中設置的緩存項目,但此緩存無法跨越這些邊界。

理論上,您可以將其存儲在ScripProperties中,但這可能非常笨拙,並且會濫用這些功能,並且會在所有用戶之間共享。

ScriptProperties.setProperty("test", "test") 

var result = ScriptProperties.getProperty("test"); 

如果你能深入解釋你的用例多一點,或許我們可以提供一些替代解決方案。

+0

用例是爲用戶彈出一個表單,用於輸入一些憑證,保存它們,然後讓自定義函數使用這些憑證進行REST調用。 – adrianb

+0

啊。您可能必須將其傳遞到自定義函數中。雖然我明白mayb對於敏感數據不是很安全。或者,您可以使用自定義菜單將數據按需設置到單元格中。 –

相關問題