Вставьте метку времени на основе определенных критериев - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь создать базовый скрипт метки времени. Короче говоря, я запускаю некоторые задачи, которые проходят через различные статусы (статус 1, 2, 3 и т. Д.). Я хочу отслеживать отметку времени каждого состояния для каждой задачи (строки).

У меня уже есть код, который может это сделать, но только когда я вручную вводю статус по одному в первом столбце (временные метки правильно добавляются в соответствующий столбец состояния), но я не могу обновить несколько одновременно ,

Если я вставляю несколько «status», сценарий запускает только метку времени, основанную на первой строке, и не учитывает другой статус. Вот очень короткое видео , которое демонстрирует, что он делает.

Я буду использовать скрипт в большом файле, который автоматически обновляется, но я не могу заставить его работать. Вот код, который я сейчас использую (извиняюсь, если это что-то простое, я в лучшем случае любитель).

function OnEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var row = range.getRow();
  var rows = range.getNumRows();
  var date = new Date();
  var dates = sheet

      .getRange(row, 3, rows)
      .getValues()
      .map(function(row) {return [row[0] || date];});
if(sheet.getRange(row, 1,rows).getValue()==1) {   sheet
   .getRange(row, 2, rows)
   .setValues(dates);
  }
  else
  {if(sheet.getRange(row, 1,rows).getValue()==2) {   sheet
   .getRange(row, 3, rows)
   .setValues(dates);
  }
    else
  {if(sheet.getRange(row, 1,rows).getValue()==3) {   sheet
   .getRange(row, 4, rows)
   .setValues(dates);
                                                 }
  }
  }
}

Если статус = 1, вставить метку времени в «Col B», если статус = 2, ввести метку времени в «Col C» и т. Д.

Вот лист , где я работаю.

1 Ответ

1 голос
/ 16 марта 2019

Попробуйте это:

Так что теперь вы можете редактировать либо одну ячейку, либо несколько ячеек, как в копии, и вставить в column1, а отметки времени появятся в столбцах e.range.columnStart + whatever the selection in column one was. Я использовал проверку данных в первом столбце, но вы можете делать все, что пожелаете. Возможно, вы захотите добавить условное выражение, например if(e.range.getSheet().getName()!='Sheet1'){return;}

function onEdit(e) {
  var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM/dd/yyyy HH:mm:ss");
  if(e.range.columnStart==1 && e.range.rowStart>1) {//if you are editing column1
    var sA=e.range.getValues();//get all values in range
    for(var i=0;i<sA.length;i++) {
      e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).setValue(timeStamp);
    }
  }
}

Вот как выглядит мой лист:

enter image description here

Я добавил несколько вариантов к действительным столбцам отметок времени

Альтернативное решение с дополнительными требованиями:

function onEdit(e) {
  var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM/dd/yyyy HH:mm:ss");
  if(e.range.columnStart==1 && e.range.rowStart>1) {//if you are editing column1
    var sA=e.range.getValues();//get all values in range
    for(var i=0;i<sA.length;i++) {
      var ts=e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).getValue();
      if(sA[i][0]>0 && !ts) {
        e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).setValue(timeStamp);
      }
    }
  }
}

И этот выбирает столбец по имени заголовка столбца, так что вы можете добавить столбцы слева от column1. Он также ограничивает действие конкретным листом в этом случае Sheet92.

function onEdit(e) {
  if(e.range.getSheet().getName()!='Sheet92'){return;}
  var colName=e.range.getSheet().getRange(1,e.range.columnStart).getValue();
  var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM/dd/yyyy HH:mm:ss");
  if(colName=='Status Choice' && e.range.rowStart>1) {
    var sA=e.range.getValues();
    for(var i=0;i<sA.length;i++) {
      var ts=e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).getValue();
      if(sA[i][0]>0 && !ts) {
        e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).setValue(timeStamp);
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...