使用Google Spreadsheets中的onEdit实时编辑单元格内容

时间:2013-04-12 18:07:44

标签: javascript google-apps-script google-sheets google-docs

我正在努力让我的onEdit脚本工作。我的工作有一个电话日志表,我们用它来跟踪电话(日期,时间,指定技术等)。我们将另一张工作表设置为名为Phone Calls by Tech的数据透视表报告。这张表应该自动计算每个技术每天的通话次数。它可以工作,但问题是在电话日志表的“分配的技术”列中的任何时候将额外的空格添加到单元格中,“技术电话”表将整个其他人视为一个整体,因此看起来好像有4个不同的“鲍勃的等等。

我已经成功编写了一个脚本,通过修剪Assigned Tech列的每个单元格中的空白来清理它,我正在尝试将其转换为onEdit脚本来实现同样的事情。

function onEdit(e) 
{ 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var r = ss.getActiveRange();
}

function myOnEdit() 
{
  function replacer( str, p1, p2, offset, s ) {
    return p1 
      }

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var cell = ss.getActiveCell().getA1Notation();
  var tsheet = "Phone Log";
  var sname = ss.getName();

  if (sname = tsheet) //Are we in the Phone Log sheet?
  {

    var r = ss.getActiveRange();
    var column = r.getColumn();

    if (column == 4) //Are we editing a cell in the "Assigned Tech" column?
    {

      var value = cell.getValue();
      if ( value == String )
      {
        value = value.replace( /^\s*(.*?)\s*$/gm , replacer );
        cell.setValue( value) ;
      } 
    }
  }

}

所以基本上,我正在尝试编辑单元格值,即“Bob”,删除空格并将输入的值替换为已编辑的单词“Bob”。我在脚本编辑器中运行上面的脚本时没有错误,但它不起作用。我确实将onMyEdit()作为onEdit触发器安装。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我很惊讶这对你有用。由于getA1Notation()调用,cell包含字符串,因此不支持.getValue().setValue()方法。

“活跃”表格的概念&单元格不适用于onEdit()触发函数;它们在自己的执行实例中调用,并将一个事件传递给它们以提供上下文。请参阅Understanding Events

你也在=犯了一个简单但灾难性的错误。单个=是一个赋值操作,有两种比较,=====。 (第一个比较两个对象的内容,第二个比较这些对象的类型。)当你有if (sname = tsheet)时,它没有比较表的名称,而是分配tsheet的内容到sname,然后对sname进行布尔测试。 (这种类型的错误不会被解释器捕获,因为它完全有效......它不是你想要的。)

当您检查if ( value == String )时,是否要检查值的TYPE是否为字符串?如果是这样,就会这样做:if (typeof value === 'string')

更新了脚本

function myOnEdit(e) 
{
  function replacer( str, p1, p2, offset, s ) {
    return p1 
      }

  var ss = e.source;
  var cell = e.range;
  var tsheet = "Phone Log";
  var sname = ss.getName();

  if (sname === tsheet) //Are we in the Phone Log sheet?
  {

    var column = cell.getColumn();

    if (column == 4) //Are we editing a cell in the "Assigned Tech" column?
    {

      var value = cell.getValue();
      if (typeof value === 'string')
      {
        value = value.replace( /^\s*(.*?)\s*$/gm , replacer );
        cell.setValue( value );
      } 
    }
  }
}