2016-01-27 2 views
1

Мне было интересно, возможно ли, что делать и как это сделать. Это для Google Таблиц. Вот сценарий я использую (Найдено этот сценарий и редактировать его для моего использования):Обновления TimeStamp для смежных столбцов

function onEdit(e) { 
var s = e.source.getActiveSheet().getName(); 
var cols = [5]; 
if (s !== 'Michele' && s !== 'Janet' && s !== 'Stephanie' || cols.indexOf(e.range.columnStart) ==-1 || !e.value) return; 
    e.range.offset(0,1).setValue(Utilities.formatDate(new Date(), "CST", "MM/dd/yyyy HH:mm:ss")); 
} 

Колонка 5 (E) имеет возможность выбрать различные статусы. До сих пор у меня он помещал TimeStamp of Column 5 в соседний столбец 6 (F). То, что я пытаюсь выяснить, - это изменить статус (Pending -> Confirmed-> Installed-> ect) вместо обновления столбца 6, который уже будет TimeStamped, вместо этого он перейдет к столбцу 7, затем 8, затем 9, ect.

Сообщите мне, если требуется более подробная информация.

Спасибо!

+0

Вы хотите метку определенного статуса, чтобы войти в определенные колонки, или вы хотите, чтобы идти смежны в каждом случае? –

+0

Я думаю, что смешно во всех случаях –

ответ

0

Я протестировал этот код, и он работает. Он находит количество ячеек справа от столбца E, которые уже имеют в них значения, а затем вычисляет, что следующий пустой столбец, и записывает новую дату в следующий пустой столбец.

function onEdit(e) { 
    var sh = e.source.getActiveSheet(); 
    var s = sh.getName(); 
    var lastCol = sh.getLastColumn(); 
    var cols = [5]; 
    var startCol = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('ColumnE').getColumn(); 
    //In the spreadsheet, name a range that is in the column you want to start at 
    if (s !== 'Michele' && s !== 'Janet' && s !== 'Stephanie' || cols.indexOf(e.range.columnStart) ==-1 || !e.value) return; 

    var rowEdited = e.range.getRow(); //Get the row that was edited 
    //Start in row edited and column 6, get 1 row and X columns 
    var datesInCells = sh.getRange(rowEdited,startCol,1,lastCol - 5).getValues(); 

    Logger.log('datesInCells: ' + datesInCells); 
    Logger.log('datesInCells.length: ' + datesInCells[0].length); 

    var numberOfDates = 0; 

    for (var i=0;i<datesInCells[0].length;i+=1) { 
    if (datesInCells[0][i] !== "") { 
     numberOfDates +=1; 
    }; 
    }; 

    Logger.log('numberOfDates: ' + numberOfDates); 

    var colToWriteTo = startCol + numberOfDates; 
    var newDate = Utilities.formatDate(new Date(), "CST", "MM/dd/yyyy HH:mm:ss"); 
    //var theStatus = sh.getRange(rowEdited, 5).getValue(); 
    var theStatus = e.value; 
    var bothStatusAndDate = newDate + " : " + theStatus; 

    sh.getRange(rowEdited,colToWriteTo).setValue(bothStatusAndDate); 
}; 

Версия два:

function onEdit(e) { 
    var sh = e.source.getActiveSheet(); 
    var s = sh.getName(); 
    var lastCol = sh.getLastColumn(); 
    var cols = [5]; 

    if (s !== 'Michele' && s !== 'Janet' && s !== 'Stephanie' || cols.indexOf(e.range.columnStart) ==-1 || !e.value) return; 

    var rowEdited = e.range.getRow(); //Get the row that was edited 
    //Start in row edited and column 6, get 1 row and X columns 
    var datesInCells = sh.getRange(rowEdited,6,1,lastCol - 5).getValues(); 

    Logger.log('datesInCells: ' + datesInCells); 
    Logger.log('datesInCells.length: ' + datesInCells[0].length); 

    var numberOfDates = 0; 

    for (var i=0;i<datesInCells[0].length;i+=1) { 
    if (datesInCells[0][i] !== "") { 
     numberOfDates +=1; 
    }; 
    }; 

    Logger.log('numberOfDates: ' + numberOfDates); 
    var newDate = Utilities.formatDate(new Date(), "CST", "MM/dd/yyyy HH:mm:ss"); 
    if (numberOfDates > 4) { 
    var existingValues = sh.getRange(rowEdited,7,1,4).getValues(); 
    sh.getRange(rowEdited,6,1,4).setValues(existingValues); 
    sh.getRange(rowEdited,10).setValue(newDate); 
    return; 
    }; 

    var colToWriteTo = 6 + numberOfDates; 

    sh.getRange(rowEdited,colToWriteTo).setValue(newDate); 
}; 
+0

Удивительный. Он отлично работает! Но, если в столбце 5 (состояние 1) есть вещи в любом столбце, он помещает метку времени дальше, чем мне нужно. Вот ссылка, чтобы вы могли видеть, что происходит. Вкладка Michele - это та, на которую я смотрел, но она делает это для всех трех этих вкладок в скрипте. https://docs.google.com/spreadsheets/d/1CcqoDaI8hy3-hMsb5NRF2j1cipW_JOpEJ-utdY7Tg0s/edit?usp=sharing –

+0

Хорошо, вам нужно, чтобы он остановился, когда он добрался до колонки J? Или остановитесь, когда дойдете до «Финальной отметки о статусе»? И что тогда? Начать перезапись датируется в начале? –

+0

Я бы хотел, чтобы он остановился, когда добрался до «Final Status TimeStamp». Если это возможно, в этот момент он должен начать перезаписывать «Status 1 TimeStamp». Если он не может работать таким образом, все в порядке, администраторы не смогут увидеть временную метку, поскольку они предназначены только для моих глаз, поэтому я мог бы всегда добавлять дополнительные столбцы для временных меток, если это необходимо. У меня также есть другой вопрос, который может быть немного растянут. Когда статус изменен, возможно ли, чтобы этот статус появился вместе с датой в столбцах временной метки? Еще раз спасибо за помощь. –