时间 table Google sheet
Temporal table Google sheet
我正在使用 google sheet 作为主数据库。
数据被发送并存储到 2 sheets,用户可以在其中与之交互。
用户也可以修改数据。
目标是跟踪 2 sheet 中的所有更改并将更改复制到另一个 sheet 中。
如果 sheet 1 被修改,编辑的行将被复制到 HistoricalSheet 1 并且 sheet 2 也是如此。
当数据被复制时,它会附带一个时间戳和修改 sheet.
的用户 ID
我的问题是检索行范围时未定义。
这是我的代码:
function onEdit(e){
var timeStamp = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
var userID = Session.getActiveUser().getUserLoginId();
var sourceSheet = e.range.getSheet();
var row = e.range.getRow();
var rowRange = sourceSheet.getRange(row, 1, 1, sourceSheet.getLastColumn());
var rowValues = rowRange.getValues()[0];
if(sourceSheet.getSheetName() == 'Sheet1'){
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
targetSheet.appendRow([timeStamp,userID,rowValues]);
} else if(sourceSheet.getSheetName() == 'Sheet2'){
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
targetSheet.appendRow([timeStamp,userID,rowValues]);
}
}
试试这个:
function onEdit(e){
const ts = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
const uid = Session.getActiveUser().getUserLoginId();
const sh = e.range.getSheet();
const rg = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn());
const vs = rg.getValues()[0];
if(sh.getSheetName() == 'Sheet1'){
let tsh = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
tsh.appendRow([ts,uid,vs]);
} else if(sh.getSheetName() == 'Sheet2'){
let targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
targetSheet.appendRow([ts,uid,vs]);
}
}
从您的The onEdit works now based on this link. the issue now that the timestamp, the userid are append but the values is in form of [Ljava.lang.Object;@34c3ed94 in a cell only. The values aren't append to the rest of the row.
回复中,了解到您的My issue is that when retrieving the row range, it is undefined.
问题已经解决。
关于您当前的问题,我认为您出现问题的原因是 rowValues
是一个数组。那么在这种情况下,下面的修改呢?
修改后的脚本:
function installedOnEdit(e) {
var timeStamp = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
var userID = Session.getActiveUser().getUserLoginId();
var sourceSheet = e.range.getSheet();
var rowRange = sourceSheet.getRange(e.range.rowStart, 1, 1, sourceSheet.getLastColumn());
var rowValues = rowRange.getValues()[0];
var obj = { "Sheet1": "HistoricalSheet 1", "Sheet2": "HistoricalSheet 2" };
var sheetName = sourceSheet.getSheetName();
if (!obj[sheetName]) return;
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName(obj[sheetName]);
targetSheet.appendRow([timeStamp, userID, ...rowValues]); // targetSheet.appendRow([timeStamp, userID, rowValues.join(",")]);
}
- 在此修改中,已编辑的行被放入另一个 Spreadsheet 中的规范 sheet,使用对象搜索 sheet 名称。至此,我觉得脚本可以简单一点。
- 并且,通过
targetSheet.appendRow([timeStamp, userID, ...rowValues])
,将编辑的行放入一行。
- 如果要将行值放在一个单元格中,请修改为
targetSheet.appendRow([timeStamp, userID, rowValues.join(",")])
。
注:
- 本次修改,我将函数名由
onEdit
修改为installedOnEdit
。因为使用SpreadsheetApp.openById
时,需要使用可安装的OnEdit触发器。但是,当可安装的 OnEdit 触发器安装到函数 onEdit
时,onEdit
对于简单触发器和具有异步过程的可安装触发器都是 运行。所以,我修改了函数名。所以,请将可安装的OnEdit触发器安装到函数installedOnEdit
,并再次测试。
参考文献:
我正在使用 google sheet 作为主数据库。 数据被发送并存储到 2 sheets,用户可以在其中与之交互。 用户也可以修改数据。 目标是跟踪 2 sheet 中的所有更改并将更改复制到另一个 sheet 中。 如果 sheet 1 被修改,编辑的行将被复制到 HistoricalSheet 1 并且 sheet 2 也是如此。 当数据被复制时,它会附带一个时间戳和修改 sheet.
的用户 ID我的问题是检索行范围时未定义。
这是我的代码:
function onEdit(e){
var timeStamp = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
var userID = Session.getActiveUser().getUserLoginId();
var sourceSheet = e.range.getSheet();
var row = e.range.getRow();
var rowRange = sourceSheet.getRange(row, 1, 1, sourceSheet.getLastColumn());
var rowValues = rowRange.getValues()[0];
if(sourceSheet.getSheetName() == 'Sheet1'){
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
targetSheet.appendRow([timeStamp,userID,rowValues]);
} else if(sourceSheet.getSheetName() == 'Sheet2'){
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
targetSheet.appendRow([timeStamp,userID,rowValues]);
}
}
试试这个:
function onEdit(e){
const ts = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
const uid = Session.getActiveUser().getUserLoginId();
const sh = e.range.getSheet();
const rg = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn());
const vs = rg.getValues()[0];
if(sh.getSheetName() == 'Sheet1'){
let tsh = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
tsh.appendRow([ts,uid,vs]);
} else if(sh.getSheetName() == 'Sheet2'){
let targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
targetSheet.appendRow([ts,uid,vs]);
}
}
从您的The onEdit works now based on this link. the issue now that the timestamp, the userid are append but the values is in form of [Ljava.lang.Object;@34c3ed94 in a cell only. The values aren't append to the rest of the row.
回复中,了解到您的My issue is that when retrieving the row range, it is undefined.
问题已经解决。
关于您当前的问题,我认为您出现问题的原因是 rowValues
是一个数组。那么在这种情况下,下面的修改呢?
修改后的脚本:
function installedOnEdit(e) {
var timeStamp = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
var userID = Session.getActiveUser().getUserLoginId();
var sourceSheet = e.range.getSheet();
var rowRange = sourceSheet.getRange(e.range.rowStart, 1, 1, sourceSheet.getLastColumn());
var rowValues = rowRange.getValues()[0];
var obj = { "Sheet1": "HistoricalSheet 1", "Sheet2": "HistoricalSheet 2" };
var sheetName = sourceSheet.getSheetName();
if (!obj[sheetName]) return;
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName(obj[sheetName]);
targetSheet.appendRow([timeStamp, userID, ...rowValues]); // targetSheet.appendRow([timeStamp, userID, rowValues.join(",")]);
}
- 在此修改中,已编辑的行被放入另一个 Spreadsheet 中的规范 sheet,使用对象搜索 sheet 名称。至此,我觉得脚本可以简单一点。
- 并且,通过
targetSheet.appendRow([timeStamp, userID, ...rowValues])
,将编辑的行放入一行。 - 如果要将行值放在一个单元格中,请修改为
targetSheet.appendRow([timeStamp, userID, rowValues.join(",")])
。
注:
- 本次修改,我将函数名由
onEdit
修改为installedOnEdit
。因为使用SpreadsheetApp.openById
时,需要使用可安装的OnEdit触发器。但是,当可安装的 OnEdit 触发器安装到函数onEdit
时,onEdit
对于简单触发器和具有异步过程的可安装触发器都是 运行。所以,我修改了函数名。所以,请将可安装的OnEdit触发器安装到函数installedOnEdit
,并再次测试。