谷歌工作表形式功能不更新与脚本输入的数据

时间:2016-04-28 20:03:40

标签: google-apps-script google-sheets

我在google工作表中使用函数计算使用脚本插入的值时遇到了一些麻烦。

我有一个谷歌脚本,它根据脚本创建的表单中的用户输入数据向表单添加数据。因此,在表单中,用户输入其名称,选择产品和一些选项,然后脚本将其添加到名为'Client Data Sheet'的工作表中。

然后,我有一张不同的表,应该用数学来计算价格。我的脚本将隐藏模板行中的所有函数复制到下一个可用行中,因此,例如,单元格D7包含='Client Data Sheet'!A4,D8包含='Client Data Sheet'!B4等...这些都显示正确的值。

问题是价格计算功能,在同一个计算表中,它具有前一个编码器编写的相当复杂的功能。此功能应根据同一工作表中的数据计算产品和选项的价格。它不会调用脚本,只是从其他工作表中的单元格中提取数据,运行一些if()检查以决定是否在总价格中添加额外成本,并将其全部添加。

问题是,它不会根据新数据进行更新。它只显示0,好像其他单元格是空的,即使它们现在包含通过从另一个由脚本编辑的工作表中提取数据而更新的数据。如果我进入编辑功能并按下回车键,它会正确地重新计算,所以我基本上只需要根据它所依赖的单元格中的新数据重新评估该功能。

我的理论是它没有更新功能,因为我没有直接编辑它所依赖的单元格。我可以尝试改变其他编码器编写的笨拙,巨大的功能,因此它从我的脚本编辑的电子表格中提取,而不是从复制到该数据的单元格中提取,但这似乎是一种解决方法,并且令人不满意。

TL; DR:函数不会根据从单元格中更改的数据进行更新,这些数据会从脚本填充的其他单元格中复制数据。有人对如何更新功能有任何建议吗?

编辑:好的,所以如果我确保不更新的功能从脚本更新的单元格中提取至少一些数据,它就可以工作。似乎它没有认识到移除的细胞也已经更新。它会更好,但如果它能够从脚本更新的单元格中提取数据。如果客户稍后请求更改而不必编辑从中提取数据的隐藏工作表,这将允许工作表的其他用户更改产品。

代码:

这会在我的电子表格中复制一个包含数学函数的模板行:

function new_client(){
  var ss =    SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Liquidation');
  if(ss.getName()=="Data" || ss.getName().indexOf("Liq")==0){
    var last_row = ss.getLastRow();
    var last_col = ss.getLastColumn();
    ss.insertRowsAfter(last_row, 1);
    var template_row = 4;
    var copy_range = ss.getRange(template_row, 1, 1, last_col);
    var paste_range = ss.getRange(last_row+1, 1, 1, last_col);
    copy_range.copyTo(paste_range, {contentsOnly:false});
    paste_range.getCell(1,1).setValue("NO");
    SpreadsheetApp.flush();
  }
}

这会将表单中的数据复制到不同的电子表格中,上面编辑的工作表从中提取数据:

  var clientSheet = SpreadsheetApp.getActive().getSheetByName('Client Data Sheet');
  clientSheet.insertRowsAfter(clientSheet.getMaxRows(), 1)

  var lastRow = clientSheet.getLastRow() + 1;
  var lastColumn = clientSheet.getLastColumn();

  var destRow = clientSheet.getRange(lastRow, 1, 1, lastColumn);

  var column = 1;
  for (var key in user) {
    if (user.hasOwnProperty(key)) {
      destRow.getCell(1, column).setValue(user[key]);
      column++;
    }
  }  

因此,例如,运行此代码后,客户数据表包含一个单元格B4,现在包含所选产品的名称," foo& #34 ;. 清算表格中有一个单元格,可以将其称为A5,其中包含函数='Client Data Sheet'!B4,以及另一个具有价格计算功能的单元格:{{1 }}

当上面的脚本插入表单中的值时,客户端表中的单元格=if(A5="foo", 100, 0) B4 >清算表将包含正确的值,但具有计算功能A5的单元格将不会更新。

0 个答案:

没有答案