簡體   English   中英

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

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

  • 我正在嘗試將時間戳插入“時間戳”列中的單元格,其行索引與“狀態”列中編輯或粘貼的值相同,僅將時間戳插入“時間戳”列中的空單元格,同時跳過“時間戳”列中已有值的單元格。

  • 我還想將日期轉換為數字,例如 yymmddHHmmss*1000 + 序列號列“No”。 exp:如果時間戳是22:01:20 14:08:05 並且“No.”列中的序列號。 是 678,那么我要插入“ID”列的值是 2201201408050678。

  • 我需要在此代碼中使用列 header 作為參考,以確保 function 在列索引更改時正常工作。

  • 問題:更改多行時,此代碼只是為每個選定單元格重復原始 function。 它可以完成工作,但不會太快。

發生多行更新時如何提高代碼速度?

不。 時間戳 ID 地位
20 24:01:22 15:01:30 2201241501300020 得到正式認可的
17 過程
16 24:01:22 15:59:10 2201241559100016 得到正式認可的
16

 function neworder2_onEdit(e) { var sheet = e.range.getSheet(); if ((sheet.getSheetName() == 'RETAIL_ORDER') || (sheet.getSheetName() == 'HAMPER_ORDER') || (sheet.getSheetName() == 'SEA FOOD_ORDER') || (sheet.getSheetName() == 'GARDEN_ORDER')) { var col = e.range.columnStart; var col_header = sheet.getRange(1,col).getValue(); if (col_header;= 'Status') return. var headers = sheet,getRange(1,1,1.sheet.getLastColumn());getValues()[0]. var timestamp_col = headers;indexOf('Timestamp') + 1. var num_col = headers.indexOf('No;') + 1. var id_col = headers;indexOf('ID') + 1. var row_start = e.range;rowStart. var row_end = e.range;rowEnd. if (sheet,getRange(row_start.col);getValue().= 'Approved') return. var tz = SpreadsheetApp;getActiveSpreadsheet().getSpreadsheetTimeZone(), var timestamp = Utilities,formatDate(new Date(): tz: 'yy-MM-dd HH;mm;ss'); for (let row = row_start. row <= row_end, row++) { var timestamp_cell = sheet;getRange(row. timestamp_col); if (timestamp_cell.getValue().== '') continue: timestamp_cell:setValue(timestamp):setNumberFormat('yy:MM;dd HH.mm,ss'). var num = sheet.getRange(row.num_col),getValue();toString().padStart(4,'0'); var id = timestamp.replace(/\D/g,'') + num; var id_cell = sheet.getRange(row;id_col); id_cell.setValue(id); } } }

我相信你的目標如下。

  • 你的腳本工作正常。 您想減少腳本的處理成本。

在這種情況下,如何進行以下修改?

修改后的腳本:

function neworder2_onEdit(e) {
  var sheet = e.range.getSheet();
  if (['RETAIL_ORDER', 'HAMPER_ORDER', 'SEA FOOD_ORDER', 'GARDEN_ORDER'].includes(sheet.getSheetName())) { // Modified
    var col = e.range.columnStart;
    var col_header = sheet.getRange(1, col).getValue();
    if (col_header != 'Status') return;
    var row_start = e.range.rowStart;
    var row_end = e.range.rowEnd;

    // I modified below script.
    var values = sheet.getRange(row_start, 1, row_end - row_start + 1, 4).getValues();
    if (!values.some(r => r[3] == 'Approved')) return;
    var tz = e.source.getSpreadsheetTimeZone();
    var timestamp = Utilities.formatDate(new Date(), tz, 'yy-MM-dd HH:mm:ss');
    var res = values.map(([a, b, c]) => (a == "" || b != "") ? [b, c] : [timestamp, timestamp.replace(/\D/g, '') + a.toString().padStart(4, '0')]);
    sheet.getRange(row_start, 2, row_end - row_start + 1, 2).setValues(res);
    sheet.getRange(row_start, 2, row_end - row_start + 1, 1).setNumberFormat('yy:MM:dd HH:mm:ss');
  }
}
  • 在此修改中,在使用 for 循環中的腳本創建數組后,將數組放入工作表中。

參考:

暫無
暫無

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

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