簡體   English   中英

在谷歌表格中的 C 列中的值復制/粘貼或插入/編輯整行時插入時間戳,僅插入空白單元格

[英]Insert timestamp when value copy/paste or inserts/edits whole row in Column C in google sheets, only insert to blank cell

  • 我正在嘗試將時間戳插入 B 列中的單元格,該單元格具有與 C 列中編輯或粘貼的值相同的行索引。 另外,我只想在 B 列的空單元格中插入時間戳,而跳過單元格已經有時間戳。

  • 無論我是編輯 C 列中的單元格,還是在 B 列中的所有單元格為空時將值粘貼到 C 列中,此代碼都能正常工作。

  • 此代碼在粘貼多個單元格時存在覆蓋或不寫入值的問題。 請幫我編輯它。

  • 這是樣本表: 插入時間戳 - 多單元格 - 檢查空白單元格

 function insert_timestamp(e) { var s = SpreadsheetApp.getActiveSheet(); var cell = s.getActiveCell(); var r = e.range; var firstRow = r.getRow(); var numRows = r.getNumRows(); var firstCol = r.getColumn(); var lastCol = r.getLastColumn(); var datecell = s.getRange(cell.getRowIndex(), 2); if((firstCol == 3 || lastCol == 3) && s.getName() == 'test' && datecell.isBlank()) { var destRange = s.getRange(firstRow, 2, numRows); var dates = new Array(numRows).fill([new Date()]); destRange.setValues(dates).setNumberFormat("MM/dd/yyyy hh:mm:ss"); } }

我相信你的目標如下。

  • 您想在編輯“C”列時將日期放在“B”列。
  • 在這種情況下,當“B”列為空時,您想輸入日期。
  • insert_timestamp 的insert_timestamp作為 OnEdit 觸發器安裝。

為了檢查列“B”和“C”的值,我從已編輯行的列中檢索了值。 而且,我認為事件 object 可以用於您的情況。 從這幾點來看,下面的示例腳本怎么樣?

示例腳本:

function insert_timestamp(e) {
  var range = e.range;
  var sheet = range.getSheet();
  if ((range.columnStart == 3 || range.columnEnd == 3) && sheet.getSheetName() == 'test') {
    var values = range.offset(0, -1, range.rowEnd - range.rowStart + 1, 2).getDisplayValues();
    var rangeList = values.reduce((ar, [b, c], i) => {
      if (b == "") ar.push("B" + (i + range.rowStart));
      // if (b == "" && c != "") ar.push("B" + (i + range.rowStart));
      return ar;
    }, []);
    sheet.getRangeList(rangeList).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm:ss");
  }
}
  • 如果在“C”列為空時不想將日期放入“B”列,請使用if (b == "" && c.= "") ar.push("B" + (i + range;rowStart)); 而不是if (b == "") ar.push("B" + (i + range.rowStart)); .

筆記:

  • 此示例腳本由 OnEdit 觸發器運行。 所以當你直接運行這個function的時候,就會報錯。 請注意這一點。

參考:

根據您的代碼,我想稍微改進一下。

  • 問題:當我添加或刪除列時,“時間戳”和“狀態”列的位置發生變化,導致代碼失敗。 我正在尋找一種解決方案,以在“時間戳”和“狀態”列的索引更改時使此代碼正常工作。
  • 我正在嘗試在代碼中使用列 header 而不是列的索引。 @tanaike:你能幫我解決這個問題嗎?

 function insert_timestamp(e) { //get range var range = e.range; var sheet = range.getSheet(); // get header var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); var editcol = headers[0].indexOf("Status") + 1; var timestampcol = headers[0].indexOf("Timestamp") + 1; if ((range.columnStart == editcol || range.columnEnd == editcol) && sheet.getSheetName() == 'CONTENT.ORDER') { var values = range.offset(0, -1, range.rowEnd - range.rowStart + 1, 2).getDisplayValues(); var rangeList = values.reduce((ar, [b, c], i) => { if (b == "" && c =="Approved") ar.push("b" + (i + range.rowStart)); return ar; }, []); sheet.getRangeList(rangeList).setValue(new Date()).setNumberFormat("yy:MM:dd HH:mm:ss"); } }


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM