#google-apps-script #google-sheets #timestamp
#google-apps-script #google-sheets #временная метка
Вопрос:
Я пытаюсь создать базовый скрипт с временной меткой. Короче говоря, я запускаю некоторые задачи, которые имеют разные статусы (статус 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. Это не имеет смысла,
if(sheet.getRange(row, 1,rows).getValue()==1)
еслиrows >1
вы просто получите значение верхней левой ячейки.2. Я считаю, что это столбец, если строка в столбце 1 = 1, вставьте временную метку в столбец 2. и так далее. Не стесняйтесь попробовать это: docs.google.com/spreadsheets/d/… Однако проблема для меня заключается в выполнении нескольких операций одновременно (при вставке нескольких статусов).
Ответ №1:
Попробуйте это:
Итак, теперь вы можете отредактировать либо одну ячейку, либо несколько ячеек, как при копировании и вставке в 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 amp;amp; 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);
}
}
}
Вот как выглядит мой лист:
Я добавил несколько вариантов в допустимые для большего количества столбцов временные метки
Альтернативное решение с дополнительными требованиями:
function onEdit(e) {
var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM/dd/yyyy HH:mm:ss");
if(e.range.columnStart==1 amp;amp; 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 amp;amp; !ts) {
e.range.getSheet().getRange(e.range.rowStart i,Number(sA[i][0]) e.range.columnStart).setValue(timeStamp);
}
}
}
}
И этот выбирает столбец по имени заголовка столбца, чтобы вы могли добавлять столбцы слева от column1. Это также ограничивает действие определенным листом, в данном случае листом92.
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' amp;amp; 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 amp;amp; !ts) {
e.range.getSheet().getRange(e.range.rowStart i,Number(sA[i][0]) e.range.columnStart).setValue(timeStamp);
}
}
}
}
Комментарии:
1. Убедитесь, что вы получили последнюю версию, поскольку я редактировал ее пару раз.
2. Это абсолютно фантастично, Купер! Если это не слишком сложно, есть ли способ проверить столбец timestamp, чтобы вставлять временную метку только в том случае, если она пуста? (чтобы избежать перезаписи существующей временной метки?) Кроме того, я заметил, что если ячейка «Выбор статуса» удаляется (0 или null), она вставляет временную метку вместо статуса (первый столбец). Есть ли способ ограничить вставку временной метки только в определенные диапазоны временных меток (например, B: G). Ценю вашу помощь.
3. Спасибо за обновления, Купер, я бы никогда не смог придумать это. Последний вопрос, я пытаюсь оставить формулы в столбце выбора статуса, например, в столбце A, строка 2 (первый статус):
if(Z2="Status1",1,if(Z2="Status2",2,"")
но временная метка не запускается с результатами формулы. Вы случайно не знаете, почему или как я могу заставить это работать с формулами? (таким образом, я заполняю весь столбец 1 формулами, чтобы прочитать фактический статус текста строки, и возвращаю число (1-10), чтобы добавить соответствующую временную метку. (У меня есть другой скрипт, который постоянно вставляет фактический текстовый статус) Еще раз спасибо.4. Простые триггеры предназначены для запуска только тогда, когда пользователь вносит изменения. Есть несколько устанавливаемых триггеров, которые обнаруживают некоторые изменения. Вы можете прочитать о них здесь .
5. Я бы сказал, что ваш лучший вариант — использовать проверку данных в этом столбце