2017-06-06 105 views
0

我正在爲其他教師創建一個系統來輕鬆跟蹤學生的進度。我爲每個學生準備了一張電子表格,並附有一張表格,供所有學生使用。該電子表格連接到它下面的腳本:Google Apps腳本未正確更新

function SheetNames() { 
try { 
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets() 
    var out = new Array(sheets.length+1) ; 
    for (var i = 1 ; i < sheets.length ; i++) { 
    out[i] = [sheets[i-1].getName()]; 
    } 
    return out 
} 
catch(err) { 
    return "#ERROR!" 
} 
} 

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Student List') 
     .addItem('Update Student List', 'SheetNames') 
     .addToUi(); 
} 

在「概述」工作表,我有一個只包含=SheetNames()細胞。當我第一次進入自定義函數時,列表會填充。當我打開電子表格時,菜單會按原樣添加。但是,當我單擊菜單項時,「概覽」工作表上的學生列表不會更新。無論如何要讓這個功能自動更新?

+0

您可以將'SpreadsheetApp.flush()'添加到底部的'SheetNames()'函數中。 [Apps腳本文檔](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#flush) –

+0

@SandyGood試過,仍然沒有運氣。我也嘗試命名函數'onEdit()'使其在每次編輯時自動更新,並且我嘗試添加基於時間的事件觸發器。我無法讓這個東西自動更新。 –

回答

0

它不會更新,因爲該函數所做的只是返回一個數組。當您使用= SheetNames()表示法時,您正在給它一個寫入範圍(放置公式的單元格)。

當您通過菜單點擊運行該功能時,它不知道電子表格中目標範圍的任何內容。它只是創建一個變量('out'),將其存儲在內存中,然後在該函數完成執行時銷燬它。

如果您想寫入特定範圍,則應在函數中引用它。下面是寫一個隨機數從0到100到小區中第一片

function populateCell() { 

var number = Math.random() * 100; 
var cell = SpreadsheetApp.getActiveSpreadsheet() 
         .getSheets()[0] 
         .getRange("A1"); 

cell.setValue(number); 

} 


function onOpen() { 

SpreadsheetApp.getUi() 
       .createMenu('menu') 
       .addItem('run', 'populateCell') 
       .addToUi(); 



} 

它不會作爲一個自定義函數的工作,雖然A1的功能的一個簡單的例子。根據GAS文檔,如果函數是從單元調用的(是自定義函數),則該函數是隻讀的,並且不能設置值。https://developers.google.com/apps-script/guides/sheets/functions

另外,不需要使用自定義函數,因爲您似乎只需要此代碼的特定範圍。如果您打算寫入當前遊標所在的任何單元格,則應刪除對特定單元格的引用,然後使用sheet.getActiveCell()代替。只能將自定義函數用於不受特定範圍限制的一般功能。

+0

我將此標記爲已解決,但我必須按照我希望的方式使用自定義函數來執行一些小技巧。我做了'cell.setValue(「」)'後跟'cell.setValue(「= sheetNames()」)',並重新填充並重新更新了我想要的列表。這甚至讓事件觸發器起作用。但是,由於某種原因,如果我用'cell.setValues(out)'替換'return out',它仍然會拒絕填充。 –

+0

當您在電子表格中使用'='符號時,它將執行該函數並將函數返回的任何內容寫入 - 例如數字或字符串 - 到您放置公式的單元格。如果用'cell.setValues(out)'(這不是return語句)替換'return'語句,它將不知道該寫什麼。相反,它會在函數內部使用'cell'變量(因爲你沒有在函數中設置它),並試圖調用一個'setValues()'方法,這會引發錯誤。 –