【问题标题】:Importing Data into a spreadsheet and reading the values with Google Script将数据导入电子表格并使用 Google Script 读取值
【发布时间】:2016-04-09 03:48:09
【问题描述】:

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

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

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

【问题讨论】:

  • [1]您是否已连接电子表格? [2]尝试"SELECT (A), (B), (D) WHERE (D) contains ' + "'" + selectedClass + "'" + ' Order by (B) asc")');
  • 问题不在于导入数据,我可以在电子表格中看到数据并且查询有效。我只是无法访问这些值。例如,如果我尝试显示单元格 A15 的值,它会给出“未定义”的值。尽管我可以看到 A15 中的名字是 John。

标签: google-apps-script google-sheets


【解决方案1】:

使用SpreadsheetApp.flush() 应用所有待处理的电子表格更改,然后再获取脚本先前修改的单元格的值。

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

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

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

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

【讨论】:

    【解决方案2】:

    我不是专家,但我想我有点弄清楚问题出在哪里......理论上很好,但可能不是正确的技术细节。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多