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



我们使用一个包含学生所有信息的主电子表格。我想创建一个UI来捕捉每个学生的分数,并将其写在谷歌表格中,我将从中生成他们的成绩单。

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

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

在获取脚本先前修改的单元格值之前,使用SpreadsheetApp.flush()应用所有挂起的电子表格更改。

发件人https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#flush()

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

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

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

我不是专家,但我想我已经找到了问题所在。。。理论上很好,但可能没有正确的技术细节。

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

最新更新