Добавление отметки времени при вводе определенных данных с другого листа в Google Sheet - PullRequest
5 голосов
/ 06 октября 2019

У меня есть Google Sheet , содержащий два листа, один с именем Форма, а другой Данные. Информация на листе данных обычно вводится через лист формы, где нажатие кнопки на листе формы отправляет данные в нижний ряд на листе данных.

Я пытаюсь выяснить, как я могу добавить метку времени к соответствующей ячейке в столбце E таблицы данных, когда ячейка в той же строке в столбце D получает слово «ОЧИЩЕННЫЙ» либо в качестве представленияиз листа формы или в виде прямой ручной записи на листе данных.

Этот код в настоящее время добавляет метку времени, но только когда я изменяю значение в столбце D непосредственно на листе данных (а не когда значения добавляются с помощьюлиста формы) и добавляет метку времени для любого добавленного значения.

var ColumnToCheck = 4;
var DateTimeLocation = [0,1];
var sheetName = 'Data'

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  if( sheet.getSheetName() == sheetName ) { 
  var selectedCell = ss.getActiveCell();
  if( selectedCell.getColumn() == ColumnToCheck) { 
  var dateTimeCell = selectedCell.offset(DateTimeLocation[0],DateTimeLocation[1]);
  dateTimeCell.setValue(new Date());
      }
  }
}

Я использую этот код для передачи данных из листа формы:

function submitData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Form");
var dataSheet = ss.getSheetByName("Data");

var values = formSS.getRange("B2:B5").getValues().reduce(function(a, b) {
    return a.concat(b)
});
var partNum = values[0];
var row;
dataSheet.getDataRange().getValues().forEach(function(r, i) {
    if (r[0] === partNum) {
        row = i + 1
    }
})
row = row ? row : dataSheet.getLastRow() + 1;
var data = dataSheet.getRange(row, 1, 1, 4).getValues()[0].map(function (el, ind){
  return el = values[ind] ? values[ind] : el;
  })
dataSheet.getRange(row, 1, 1, 4).setValues([data]);
formSS.getRange("B2:B5").clearContent()
}

Что былучший способ автоматического добавления даты, когда вводится только слово «ОЧИЩЕНО»? Дата не должна очищаться, если слово «ОЧИЩЕНО» удалено или изменено на другое слово.

РЕДАКТИРОВАТЬ - РЕШЕНИЕ

Благодаря Сораб Хорарии я смогчтобы изменить функцию UPDATE на эту, чтобы учесть мои потребности (мои дополнения к его коду прокомментированы):

function submitData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Form");
var dataSheet = ss.getSheetByName("Data");

var values = formSS.getRange("B3:B6").getValues().reduce(function(a, b) {
    return a.concat(b)
});
var partNum = values[0];
var row;
dataSheet.getDataRange().getValues().forEach(function(r, i) {
    if (r[0] === partNum) {
        row = i + 1
    }
})
row = row ? row : dataSheet.getLastRow() + 1;
var data = dataSheet.getRange(row, 1, 1, 4).getValues()[0].map(function (el, ind){
  return el = values[ind] ? values[ind] : el;
  })

var statusValue = formSS.getRange("B6").getValue();   //added

if (statusValue != 'CLEANED') {                       //added
dataSheet.getRange(row, 1, 1, 4).setValues([data]);   //added

}                                                     //added

if (statusValue == 'CLEANED') {                       //added

var now = [new Date()];
var newData =  data.concat(now)
dataSheet.getRange(row, 1, 1, 5).setValues([newData]);

 }                                                    //added

formSS.getRange("B3:B6").clearContent()
}

1 Ответ

5 голосов
/ 06 октября 2019

Обновите функцию submitData() следующим кодом -

function submitData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Form");
var dataSheet = ss.getSheetByName("Data");

var values = formSS.getRange("B2:B5").getValues().reduce(function(a, b) {
    return a.concat(b)
});
var partNum = values[0];
var row;
dataSheet.getDataRange().getValues().forEach(function(r, i) {
    if (r[0] === partNum) {
        row = i + 1
    }
})
row = row ? row : dataSheet.getLastRow() + 1;
var data = dataSheet.getRange(row, 1, 1, 4).getValues()[0].map(function (el, ind){
  return el = values[ind] ? values[ind] : el;
  })

// modification begins here
var now = [new Date()];
var newData =  data.concat(now)
dataSheet.getRange(row, 1, 1, 5).setValues([newData]);
// modification ends here  

formSS.getRange("B2:B5").clearContent()
}

По сути, я объявляю новую переменную массива ( сейчас ) и объединяю ее с существующим массив данных , формируя, таким образом, переменную "newData", а затем обновляя функцию setValues, чтобы учесть это изменение.

Надеюсь, что это поможет, и спасибо, что поделились доступом к представлению листа - я сделалскопируйте его и протестируйте решение напрямую:)

Редактировать заметку1

Что касается обновления листа только в том случае, если в раскрывающемся списке выбрано «ОЧИЩЕНО», пожалуйста, измените вашу функцию onEdit(), чтобы учесть следующее ЕСЛИ состояние -

var statusValue = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form').getRange("B6").getValue();
if (statusValue == 'CLEANED') {
  // update timestamp as required
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...