Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何为onEdit(e)函数设置更接近的范围?_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 如何为onEdit(e)函数设置更接近的范围?

Google apps script 如何为onEdit(e)函数设置更接近的范围?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我想在特定条件下为不同的列写一个时间戳。该函数应在一定范围内执行。我想用第13行作为标题行 这就是它的工作原理: 时间戳1 如果在第14行的第8列或第9列中编辑单元格,则应在同一行的第10列中写入定义的时间戳(“HH:MM:SS”) 时间戳2 如果在第14行的第16列中编辑单元格,则应在同一行的第18列中写入时间戳 为此,我使用下面的代码。不幸的是,这不起作用 如果我将范围扩展到整个表,在第一行中编写列标题(请参见:updateColName,timeStampColName),并按如下所示定

我想在特定条件下为不同的列写一个时间戳。该函数应在一定范围内执行。我想用第13行作为标题行

这就是它的工作原理:

时间戳1

如果在第14行的第8列或第9列中编辑单元格,则应在同一行的第10列中写入定义的时间戳(“HH:MM:SS”)

时间戳2

如果在第14行的第16列中编辑单元格,则应在同一行的第18列中写入时间戳

为此,我使用下面的代码。不幸的是,这不起作用

如果我将范围扩展到整个表,在第一行中编写列标题(请参见:updateColName,timeStampColName),并按如下所示定义“Header”变量,那么代码就可以工作了

var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
我做错了什么

链接到图纸行数减少的公共版本


我认为您以错误的方式声明标题:

var headers = sheet.getRange(13, 8).getValues();
这仅捕获单元格H13上的值(第13行,第8列)

如果要获取所有行值,应执行以下操作:

var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());

看起来你的函数有一些小错误

要修复它们,让我们执行以下操作:

  • 更改
    var headers=sheet.getRange(13,8).getValues()
    to
    var headers=sheet.getRange(13,1,1,sheet.getLastColumn())
  • 更改
    Utilities.formatDate(新日期(),时区,时间戳_格式)
    to
    Utilities.formatDate(现在,时区,时间戳_格式)。无需创建新的Date()对象
  • 使用
    e
    事件对象检测当前更改。更改
    var actRng=SpreadsheetApp.getActiveRange()
    var actRng=e.range
  • 在开始处添加检查,以验证是否正在更改标题下方的内容:
  • 最终解决方案: 将代码更改为:

    function onEdit(e)
    { 
      var timezone = "GMT+2";
      var timestamp_format = "HH:mm:ss";
    
      var updateColName = "Watchlist";
      var updateColName1 = "Letzte Prüfung";
      var updateColName2 = "Entry Datum"; 
      var timeStampColName = "Letzte Änderung";
      var timeStampColName1 = "Letzte Änderung 2";
    
      var now = new Date();
      var ss = SpreadsheetApp.getActiveSpreadsheet();
    
      var sheet = ss.getSheetByName('Tickerprüfung');
    
      var actRng = e.range;
      var editColumn = actRng.getColumn()-1;
      var index = actRng.getRowIndex();
      Logger.log(actRng);
    
      if (index>=13) { 
        var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn()).getValues()[0];
        var cell;
        if (editColumn === headers.indexOf(updateColName) || editColumn === headers.indexOf(updateColName1)) {
          //Checks if column I has been edited and then writes a timestamp to column K in the same line
          //Checks if column J has been edited and then writes a timestamp to column K in the same line  
          cell = sheet.getRange(index, headers.indexOf(timeStampColName)+1);
        } else if (editColumn == headers.indexOf(updateColName2)) {
          //Checks if column Q has been edited and then writes a timestamp to column S in the same line
          var cell = sheet.getRange(index, headers.indexOf(timeStampColName1)+1);
        } else {
          return;
        }
        cell.setValue(Utilities.formatDate(now, timezone, timestamp_format));
      }
    }
    

    希望这有帮助

    你能分享一下电子表格的截图吗?截图附在上面。谢谢,这很有效,但现在我有另一个问题。编辑标题行或标题行上方的单元格时,标题将被覆盖,并且上方的单元格也将被时间戳覆盖。如何确保标题行和标题行上方的范围安全?不幸的是,根据您建议的更改,我没有任何时间戳。可能是我做错了什么。我将根据您的建议添加编辑后的代码。Hello@Dpei,您必须在使用某些内容初始化值editColumn后进行if检查。将其放在
    var editColumn=actRng.getColumn()之后行。对不起,我弄错了。我误读了你的密码。我已经更新了我的建议以反映正确的解决方案。我更改了上面的代码,但是我仍然没有在我的目标列中获得任何时间戳。。。还有其他想法吗?@Dpei您可以创建一份电子表格的公开副本,并将其链接到您的问题中吗?这样我就可以复制你的问题并确定出问题所在。谢谢
    
    var index = actRng.getRowIndex();
    if (index>13) {
      //rest of the code   
    }
    
    function onEdit(e)
    { 
      var timezone = "GMT+2";
      var timestamp_format = "HH:mm:ss";
    
      var updateColName = "Watchlist";
      var updateColName1 = "Letzte Prüfung";
      var updateColName2 = "Entry Datum"; 
      var timeStampColName = "Letzte Änderung";
      var timeStampColName1 = "Letzte Änderung 2";
    
      var now = new Date();
      var ss = SpreadsheetApp.getActiveSpreadsheet();
    
      var sheet = ss.getSheetByName('Tickerprüfung');
    
      var actRng = e.range;
      var editColumn = actRng.getColumn()-1;
      var index = actRng.getRowIndex();
      Logger.log(actRng);
    
      if (index>=13) { 
        var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn()).getValues()[0];
        var cell;
        if (editColumn === headers.indexOf(updateColName) || editColumn === headers.indexOf(updateColName1)) {
          //Checks if column I has been edited and then writes a timestamp to column K in the same line
          //Checks if column J has been edited and then writes a timestamp to column K in the same line  
          cell = sheet.getRange(index, headers.indexOf(timeStampColName)+1);
        } else if (editColumn == headers.indexOf(updateColName2)) {
          //Checks if column Q has been edited and then writes a timestamp to column S in the same line
          var cell = sheet.getRange(index, headers.indexOf(timeStampColName1)+1);
        } else {
          return;
        }
        cell.setValue(Utilities.formatDate(now, timezone, timestamp_format));
      }
    }