getDisplayValue返回对象有问题吗?

时间:2019-10-29 21:30:24

标签: google-apps-script google-sheets

最大的问题是,从今天开始,当我编辑相邻的单元格时,我要向单元格添加一个日期。到目前为止,一切都很好。但是,当日期更改或相邻单元格被第二次编辑时,它不需要更改。

基本上是尝试检查单元格中是否已经有一个日期,如果有,只需返回即可。但是由于某种原因,它没有正确进行字符串比较。它永远不会将其识别为空字符串。然后我尝试使用include(),它告诉我不能在对象上使用include()。我的理解是getDisplayValue()应该总是返回一个字符串?有点茫然。

function getDate(progress) {
 //progress: cell showing progress state (Not started, begun, completed)

  var range = SpreadsheetApp.getActiveRange();
  var d = range.getDisplayValue();

  if(progress == 'Completed') { return 'done'; } 
  if(d != '') { return; } //if due date cell already has a date, don't change it
  today = new Date();
  due = new Date();
  due.setDate(today.getDate() + 7); //one week from today
  return due;
}

您知道此代码有什么问题吗?或者,如果有更优雅的选择,请开放其他解决方案。

1 个答案:

答案 0 :(得分:1)

  • 您要在活动范围的值为日期对象时运行脚本。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解是正确的,那么该修改如何?请认为这只是几个答案之一。

修改点:

  • 为了确认活动范围的值是否为日期对象,我使用getValue()来检索值,并使用Object.prototype.toString.call(d).slice(8, -1) == 'Date'来进行if语句。

修改后的脚本:

function getDate(progress) {
  Utilities.sleep(5000); // <--- Added

 //progress: cell showing progress state (Not started, begun, completed)

  var range = SpreadsheetApp.getActiveRange();
  var d = range.getValue(); // Modified

  if(progress == 'Completed') { return 'done'; } 
  if (d && Object.prototype.toString.call(d).slice(8, -1) == 'Date') { return; } // Modified
  today = new Date();
  due = new Date();
  due.setDate(today.getDate() + 7); //one week from today
  return due;
}
  • 运行getDate的功能时,如果getValue()检索的值是日期对象,则Object.prototype.toString.call(d).slice(8, -1) == 'Date'返回true。因此,if语句下面的脚本不会运行。

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。