Как установить более близкий диапазон для функции onEdit (e)? - PullRequest
2 голосов
/ 09 октября 2019

Я хотел бы написать временную метку для разных столбцов при определенных условиях. Функция должна быть выполнена в пределах диапазона. Я хотел бы использовать строку 13 в качестве строки заголовка.

Вот как это должно работать:

Отметка времени 1

Если ячейки редактируются в столбце 8 или 9 строки 14, указывается определенная отметка времени («ЧЧ: ММ»: SS ") должен быть записан в столбце 10 в той же строке.

Отметка времени 2

Если ячейки редактируются в столбце 16 из строки 14, отметка времени должна быть записана в столбце18 в той же строке.

enter image description here

Для этого я использую приведенный ниже код. К сожалению, это не работает.

Если я расширяю диапазон на всю таблицу, запишите заголовки столбцов (см .: updateColName, timeStampColName) в первой строке и определите переменную «Header» следующим образом, а затем кодработает.

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

Что я делаю не так?

Ссылка на публичную версию с уменьшенными строками листа.

https://docs.google.com/spreadsheets/d/1otiQjBbQBUhAlULau0FR3wQYT0jvm8jJLNqnGYNMBoY/edit?usp=sharing

    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();
    var index = actRng.getRowIndex();
      if (index>13) { 
    var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());

    //Checks if column I has been edited and then writes a timestamp to column K in the same line
    var dateCol = headers[0].indexOf(timeStampColName);
    var updateCol = headers[0].indexOf(updateColName); updateCol = updateCol+1;

      if (dateCol > -1 && index > 1 && editColumn == updateCol) {
        var cell = sheet.getRange(index, dateCol + 1);
        var date = Utilities.formatDate(now, timezone, timestamp_format);
            cell.setValue(date);
      }

    //Checks if column J has been edited and then writes a timestamp to column K in the same line  
    var dateCol = headers[0].indexOf(timeStampColName);
    var updateCol = headers[0].indexOf(updateColName1); updateCol = updateCol+1;

      if (dateCol > -1 && index > 1 && editColumn == updateCol) {
      var cell = sheet.getRange(index, dateCol + 1);
      var date = Utilities.formatDate(now, timezone, timestamp_format);
          cell.setValue(date);
      }

    //Checks if column Q has been edited and then writes a timestamp to column S in the same line
    var dateCol = headers[0].indexOf(timeStampColName1);
    var updateCol = headers[0].indexOf(updateColName2); updateCol = updateCol+1;

      if (dateCol > -1 && index > 1 && editColumn == updateCol) { 
      var cell = sheet.getRange(index, dateCol + 1);
          cell.setValue(now);
      }
      }

}

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Я думаю, что вы объявляете заголовки неправильно:

var headers = sheet.getRange(13, 8).getValues();

Это только перехват значения в ячейке H13 (строка 13, столбец 8)

Если выЧтобы получить все значения строк, вы должны сделать что-то вроде этого:

var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());
0 голосов
/ 09 октября 2019

Похоже, в вашей функции есть незначительные ошибки.

Чтобы исправить их, давайте сделаем следующее:

  1. Изменим var headers = sheet.getRange(13, 8).getValues(); на var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());
  2. Измените Utilities.formatDate(new Date(), timezone, timestamp_format); на Utilities.formatDate(now, timezone, timestamp_format);. Нет необходимости создавать новый объект Date ().
  3. Используйте объект события e для обнаружения текущих изменений. Измените var actRng = SpreadsheetApp.getActiveRange(); на var actRng = e.range;
  4. Добавьте проверку в начале, чтобы убедиться, что вы меняете что-то ниже заголовков:
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));
  }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...