将数据导入电子表格并使用Google Script读取值

时间:2016-03-25 15:14:31

标签: google-apps-script google-sheets

我们使用包含学生所有信息的主电子表格。我想创建一个UI来捕获每个学生的标记,并将其写入Google Sheet,我将从中生成他们的成绩单。

我使用以下代码从主列表导入数据 - 名称被正确导入,但我似乎无法提取值?我只是得到“未定义”

/**
 * 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]);
}

2 个答案:

答案 0 :(得分:0)

在获取以前由脚本修改的单元格值之前,使用SpreadsheetApp.flush()应用所有待处理的电子表格更改。

来自https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#flush()

  

电子表格操作有时会捆绑在一起进行改进   性能,例如对Range.getValue()进行多次调用时。   但是,有时您可能希望确保所有挂起的更改   是立即制作的,例如以脚本的形式显示用户数据   执行。

包含测试循环以确保IMPORTRANGE任务完成也很有帮助。这个测试循环可以检查每一定的时间,如果已经发生某些变化,就说500毫秒,例如,脚本可以在进行导入之前获得最后一行,并将其与之后的最后一行进行比较并进行循环直到最后一次大于第一次。

另一种方法是单独使用Utilities.sleep(milliseconds)。这可能有效,但由于IMPORTRANGE执行时间不确定,我们无法确定需要多少时间。

答案 1 :(得分:0)

我不是专家但是我觉得我有点弄清楚问题是什么......理论上很好,可能没有正确的技术细节。

var ss = SpreadsheetApp.getActive()将当前电子表格设置为ss值,而且没有导入的数据。因此,引用此变量实际上会在导入数据之前引用该数据。通过创建一个单独的功能和"刷新" var ss = SpreadsheetApp.getActive()解决了这个问题,我可以正常检索数据。