从Google表格中的其他表格输入特定数据时添加时间戳

时间:2019-10-06 17:43:28

标签: google-apps-script

我有一个Google Sheet,其中包含两张纸,一张名为Form,另一张名为Data。数据表上的信息通常是通过表单表输入的,单击表单表上的按钮会将数据发送到数据表的最底行。

我试图弄清楚如何在D列同一行的单元格收到“ CLEANED”一词作为来自表单的提交时,向数据表E列的适当单元格添加时间戳记表或作为数据表上的直接手动输入。

该代码当前会添加时间戳,但仅当我直接在数据表上更改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()
}

仅输入单词“ CLEANED”时自动添加日期的最佳方法是什么?如果已删除“清洁”一词或将其更改为其他词,则日期不明确。

编辑-解决方案

感谢Sourabh Choraria,我能够将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 个答案:

答案 0 :(得分:5)

使用以下代码更新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()
}

基本上,我要声明一个新的数组变量(现在),并将其连接到现有的 data 数组,从而形成一个“ newData”变量,然后更新setValues功能来适应此更改。

希望这会有所帮助,并感谢您共享对工作表的视图访问权限-我制作了该副本并直接测试了解决方案:)

编辑note1

至于仅在选择的下拉列表为“ CLEANED”时更新工作表,请修改您的onEdit()函数以适应以下 IF 条件-

var statusValue = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form').getRange("B6").getValue();
if (statusValue == 'CLEANED') {
  // update timestamp as required
}