2017-06-06 16 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 Script documentation](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#flush) –

+0

@SandyGoodそれは、まだ運がないことを試しました。私はまた、 'onEdit()'という関数の名前をつけて、編集ごとに自動更新させてみました。時間ベースのイベントトリガーで追加しようとしました。私はこの事を自動的に更新することはできません。 –

答えて

0

この機能はすべて配列を返すため更新されません。 = SheetNames()表記を使用すると、書き込む範囲(数式を入れるセル)が与えられます。

メニューをクリックして関数を実行すると、スプレッドシートの対象範囲について何もわかりません。単に変数( 'out')を作成し、メモリに格納してから、関数の実行が終了すると破棄します。

特定の範囲に書きたい場合は、関数で参照する必要があります。ここではそれはしかし、カスタム関数として機能しません最初のシートのA1をセルに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(); 



} 

の簡単な例です。 GASのドキュメントに従って、関数がセルから呼び出されている(カスタムです)場合、その関数は読み取り専用であり、値を設定することはできません。https://developers.google.com/apps-script/guides/sheets/functions

また、カスタム関数を使用する必要はありません特定の範囲でこのコードが必要です。カーソルが現在あるセルに書き込む場合は、特定のセルへの参照を削除して、代わりにsheet.getActiveCell()を使用する必要があります。特定の範囲に縛られていない一般的な機能に対してのみ、カスタム関数を使用してください。

+0

私はこれを解決してマークしていますが、私はそれが私が望むようにカスタム関数で動作させるために少しトリックをしなければなりませんでした。私は 'cell.setValue(" ")'とそれに続く 'cell.setValue(" = sheetNames() ")'を実行し、リストを再作成し、私が望むようにリストを再更新しました。これにより、イベントトリガーが機能するようになりました。しかし、何らかの理由で、 'return out'を' cell.setValues(out) 'に置き換えたとしても、それはまだ入力を拒否します。 –

+0

スプレッドシート内で '='表記を使用すると、関数が実行され、式を配置するセルに関数が返すもの(数字や文字列など)( )を書き込みます。 'return'ステートメントを 'cell.setValues(out)'(これはreturnステートメントではない)に置き換えると、何を書き込むのか分かりません。代わりに、関数内で 'cell'変数(関数で設定していないため 'null'です)を呼び出し、その上で 'setValues()'メソッドを呼び出してエラーをスローします。 –

関連する問題