当单元格等于具有匹配ID#的特定值时,在不同的工作表中添加时间戳

时间:2018-01-05 20:09:51

标签: google-apps-script google-sheets timestamp

我正在使用谷歌工作表,并有一张名为Sales的工作表存储我月份销售的数据,另一张工作表根据Item#提取索引(匹配)的库存数据。我想用“是”colum L标记销售的产品。一旦我选择YES,我希望脚本将销售日期输入到已售出商品的库存表中。我觉得我是如此接近,但我只有时间戳到相邻的单元格,我需要它来查找ID号,并将时间戳保留在销售产品的库存表中。注意:每月制作销售表的副本,将其重命名为“Sales for XXX”,然后在“Sales”表单中擦除数据清理,这样我就需要时间戳粘贴,并在下个月清除数据后不删除。

function onEdit(event){ 
  var s = SpreadsheetApp.getActiveSheet();
  if( s.getName() == "SALES" ) { //checks that we're on the correct sheet
  var ColL = 12;  // Column Number of "L"
  var changedRange = event.source.getActiveRange();
  if (changedRange.getColumn() == ColL) {
    // An edit has occurred in Column L
    var state = changedRange.getValue();
    var adjacent = 
event.source.getActiveSheet().getRange(changedRange.getRow(),ColL+1);
    var timestamp = new Date(); // Get the current time
    // We'll do something different, depending on the selected value
    switch (state) {
      case "Yes":
        // Write timestamp into adjacent cell
        adjacent.setValue(timestamp);
        break;
      case "No":
        // Erase timestamp in adjacent cell
        adjacent.clearContent();
        break;
   }
  }
 }
}

2 个答案:

答案 0 :(得分:0)

我不确定我最后会理解你的笔记的要求,但看起来你确实很接近。要在Apps脚本中查找和操作工作表中的值,可以使用范围getValues()和setValues()方法将工作表数据用作二维数组。例如,下面是一个函数,它将时间戳和ID作为参数,并在名为“INVENTORY”的工作表中找到第一列中带有ID的相应行,并将时间戳写入第二列。您需要根据工作表布局进行调整,但这可以帮助您朝着正确的方向前进。

此功能每次运行时都会重写I​​NVENTORY表。如果这太过分了,您可以使用array.forEach函数来查找ID匹配的行。 forEach回调中的第二个参数是被计算元素的索引,可用于返回匹配行的行号。

/*
  Assumes a sheet named INVENTORY with IDs in the first column and timestamps in 
  the second column, with column headers. The column headers help ensure that the 
  getValues and setValues arrays have the same dimensions.
*/
function setSoldTimestamp(timestamp,id){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('INVENTORY'); // change to your inventory sheet name
  var range = sheet.getDataRange();
  var arSheet = range.getValues();
  // there are a lot of different ways you could iterate through
  // the array to find what you are looking for. I like map and filter.
  var arOut = arSheet.map(function(row){
    if (row[0] == id) { // change index to match your ID column number - 1
      row[1] = timestamp; // change index to match your timestamp column number - 1
      return row
    } else {
      return row
    }
  });
  range.setValues(arOut);
}

答案 1 :(得分:0)

使用公式可能有一种简单的方法可以做到这一点。 用if语句。我不是从单独的表中提取数字,因为我不确定你是如何实现的。

At any rate here is a demo on a single sheet

这是我使用的代码。

function onEdit(event){ 
  var s = SpreadsheetApp.getActiveSheet();
  if( s.getName() == "SALES" ) { //checks that we're on the correct sheet
    var currCell = s.getActiveCell()
    var ajCell = s.getRange(currCell.getRow(), currCell.getColumn()+1)
    if(currCell.getValue() === "YES"){
      ajCell.setValue(new Date())
    }else{
     ajCell.setValue("")
    }                         
  }
}