将计算数据模型关联到云 SQL 模型

Relate calculated data model to Cloud SQL model

我需要创建一个 table 并排显示来自云 SQL 数据模型和计算数据模型的值,就好像数据模型是相关的一样。

费用Table

我有一个名为 'Costs' 的计算数据模型,它是从电子表格中填充的。此 table 中的数据如下所示:

PROJECT_ID, ACCRUED_COSTS, REMAINING_COSTS
0001      , 10000        , 25000
0002      , 25000        , 2000
0003      , 15000        , 5000

我用来生成计算模型的代码在这里:

return getSSData();

function getSSData(){
  var values = SpreadsheetApp.openById("SPREADSHEET_ID").getSheetByName("SHEET_NAME").getRange("RANGE").getValues();
  var ssData = [];
  for (var i = 0; i<values.length; i++){
    var newRecord = app.models.costsTable.newRecord();
   // add all fields to the new record
    newRecord.project = values[i][0].toString();
    newRecord.projectID = values[i][1].toString();
    newRecord.actual = values[i][2];
    newRecord.estimate = values[i][3];
    ssData.push(newRecord);
  }
// return the array of the model.newRecord objects that would be consumed by the Model query.
  return ssData;
}

项目Table

我还有一个名为 'Projects' 的 Cloud SQL 数据模型。此 table 中的数据如下所示:

PROJECT_ID, PROJECT_NAME   , PROJECT_BUDGET
0001      , project_alpha  , 50000
0002      , project_beta   , 30000
0003      , project_charlie, 19000

合并Table

我需要创建一个包含 table 小部件的页面,它像这样并排显示来自两个 table 的所有数据列:

PROJECT_ID, PROJECT_NAME   , PROJECT_BUDGET, ACCRUED_COSTS, REMAINING_COSTS
0001      , project_alpha  , 50000         , 10000        , 25000
0002      , project_beta   , 30000         , 25000        , 2000
0003      , project_charlie, 19000         , 15000        , 5000

问题

如果 table 可以相互关联,这将很容易,但遗憾的是计算模型不支持关联。

根据之前的评论,您有两种选择来完成此任务。无论哪种方式,将附加字段(如“Project_Name”和“Project_Budget”添加到您的计算模型中。

方案一(用索引函数获取所有记录):

function getSSData(){
  var values = SpreadsheetApp.openById("SPREADSHEET_ID").getSheetByName("SHEET_NAME").getRange("RANGE").getValues();
  var projects = app.models.Projects.newQuery().run();
  var ids = projects.map(function(p){return p.PROJECT_ID;});
  var ssData = [];
  for (var i = 0; i<values.length; i++){
    var newRecord = app.models.costsTable.newRecord();
   // add all fields to the new record
    newRecord.project = values[i][0].toString();
    newRecord.projectID = values[i][1].toString();
    newRecord.actual = values[i][2];
    newRecord.estimate = values[i][3];
    var index = ids.indexOf(values[i][1].toString());
    if(index !== -1) {
      var project = projects[index];
      newRecord.Project_Name = project.PROJECT_NAME;
      newRecord.Project_Budget = project.PROJECT_Budget;
    }
    ssData.push(newRecord);
  }
// return the array of the model.newRecord objects that would be consumed by the Model query.
  return ssData;
}

选项 2(运行 订单项查询):

function getSSData(){
  var values = SpreadsheetApp.openById("SPREADSHEET_ID").getSheetByName("SHEET_NAME").getRange("RANGE").getValues();
  var ssData = [];
  for (var i = 0; i<values.length; i++){
    var newRecord = app.models.costsTable.newRecord();
    var query = app.models.Projects.newQuery();
    query.filters.PROJECT_ID._equals() = values[i][1].toString();
    var results = query.run();
   // add all fields to the new record
    newRecord.project = values[i][0].toString();
    newRecord.projectID = values[i][1].toString();
    newRecord.actual = values[i][2];
    newRecord.estimate = values[i][3];
    if(results.length > 0) {
      var project = results[0];
      newRecord.Project_Name = project.PROJECT_NAME;
      newRecord.Project_Budget = project.PROJECT_BUDGET;
    }
    ssData.push(newRecord);
  }
// return the array of the model.newRecord objects that would be consumed by the Model query.
  return ssData;
}

我鼓励你两者都试试。在开始时为 startdate = new Date() 创建一个变量,然后在 return 数据执行 console.log(new Date() - startdate) 之前,这将为您提供以毫秒为单位的时差总脚本执行。这样你也可以自己找出哪个过程更快。