2016-03-25 14 views
0

学生のすべての情報を含むマスタースプレッドシートを使用します。それぞれの生徒のマークをキャプチャしてGoogleシートに書き込んで、レポートカードを生成するためのUIを作成したいと考えています。スプレッドシートへのデータの読み込みとGoogleスクリプトによる値の読み込み

次のコードを使用して、マスターリストからデータをインポートします。名前は正しくインポートされますが、値を取得できないようですか?私は以前にスクリプトによって修飾された細胞の値を取得する前に、すべての保留中のスプレッドシートの変更を適用するために使用SpreadsheetApp.flush()

/** 
* A function that inserts a custom menu when the spreadsheet opens to generate the Report Spreadsheet. 
*/ 
function onOpen() { 

    var menu = [{name: 'Capture Report Data', functionName: 'setUpProgressReport_'}]; 
    SpreadsheetApp.getActive().addMenu('Progress Report', menu); 

} 

/** 
* A set-up function that creates a Report Sheet based on the class selected 
*/ 
function setUpProgressReport_() { 

    var ss = SpreadsheetApp.getActive(); 
    var sheet = ss.getSheetByName('Report 1'); 
    var ui = SpreadsheetApp.getUi(), 
    response = ui.prompt(
    'Enter Class', 
    'Please enter the class you would like to enter marks for', 
    ui.ButtonSet.OK_CANCEL), 
    selectedClass = response.getResponseText(); 

    //Import names of learners by selected class from Master Sheet 

    var cell = sheet.getRange("A1"); 
    cell.setFormula('=QUERY(IMPORTRANGE("1Dxjt6W54e7n2F8a2zlRZV0n-VtCoPZTC2oZgeMPd8mE","MasterList!A1:Z2000"),"SELECT Col1, Col2,Col4 WHERE Col4 contains ' + "'" + selectedClass + "'" + ' Order by Col2 asc")'); 

    // Freezes the first row to be used as headings 
    sheet.setFrozenRows(1); 

    var lastRow = sheet.getLastRow(); 
    var lastColumn = sheet.getLastColumn(); 
    var values = SpreadsheetApp.getActiveSheet().getRange(lastRow, lastColumn).getValues(); 
    Browser.msgBox(values[0][22]); 
} 
+0

[1]スプレッドシートを接続しましたか? [2]「+」「+ selectedClass +」「+」(A)、(B)、(D)が含まれています。 –

+0

問題はデータをインポートすることではなく、スプレッドシート内のデータがわかり、クエリが機能します。私は値にアクセスできません。たとえば、セルA15の値を表示しようとすると "undefined"という値が返されます。私はA15の名前がジョンであることがわかりますが、ジョンです。 –

+0

関連:http://stackoverflow.com/questions/27555729/google-spreadsheet-app-script-will-not-wait-for-results-to-load –

答えて

0

を「未定義」を取得します。

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#flush()からスプレッドシート操作は時々そのようなRange.getValueに複数の呼び出しを行うときなど 性能を向上させるために一緒に束ねられています()。 しかし、場合によっては、保留中の変更 がすぐに実行されるようにすることができます。たとえば、スクリプトとしてユーザーデータを表示する場合は、 が実行されます。

また、IMPORTRANGEタスクが完了したことを確認するためのテストループを含めると便利です。このテストループは、特定の変更がすでに発生している場合は、一定の時間が経過するたびに500ミリ秒を確認できます。たとえば、スクリプトはインポートを実行する前に最後の行を取得し、最後は最初のものよりも大きい。

代わりに、Utilities.sleep(milliseconds)を単独で使用することもできます。これはうまくいくかもしれませんが、IMPORTRANGEの実行時間は決定的ではないので、必要な時間が何回あるかは分かりません。

0

私は専門家ではありませんが、私は問題が何であるかを考え出したと思います...理論的にはうまくいきましたし、正しい技術的な詳細ではないかもしれません。

var ss = SpreadsheetApp.getActive()は、現在のスプレッドシートをss値として設定します。これはインポートされたデータなしです。したがって、この変数を参照すると、データがインポートされる前に実際に参照されます。別の関数を作成し、var ss = SpreadsheetApp.getActive()を "リフレッシュ"することで問題が解決され、データを正常に取得できました。

関連する問題