我目前正在使用以下代码,将名为 Postcode Checker 的工作表中第 4、10、11、12 列中的所有搜索记录到名为“APP_logs(Raw)”的工作表中
由于日志的大小,我注意到主检查器陷入困境,所以我想知道是否可以让脚本将日志导出到一个单独的电子表格中,比如命名为“search_logs”,以便它们完全与主电子表格分开?
脚本当前记录在单元格 D7:D18 中第 4 列中输入的所有邮政编码位于名为 APP_logs(RAW) 的工作表顶部,然后在单元格 J8:L18 中输入的任何邮政编码都记录在名为 PUB_logs(RAW) 的工作表中。我在下面添加了主检查器的屏幕截图。
本质上,它然后记录输入到 B 列的邮政编码和在 PUB_logs(RAW) 或 APP_logs(RAW) 的 A 列中搜索时的时间戳。我在下面添加了一个截图。
Edit 为了澄清,我想知道下面的脚本是否有可能将搜索日志完全发送到另一个电子表格,不应在 Postcode Checker 电子表格中的任何位置输入或保存日志。我在某处读到,我可以使用 open(file)、openById(id) 或 openByUrl(url) 而不是 getActiveSpreadsheet(),然后使用可安装的触发器而不是简单的触发器,但我不知道从哪里开始。
function onEdit(e) {
if (!e) {
throw new Error(
'Please do not run the onEdit(e) function in the script editor window. '
+ 'It runs automatically when you hand edit the spreadsheet.'
);
}
logColumns_(e);
}
/**
* Automatically logs changes in columnsToWatch in sheetsToWatch.
*
* @param {Object} e The onEdit() event object.
*/
function logColumns_(e) {
// version 1.2, written by --Hyde, 10 February 2022
// - see https://support.google.com/docs/thread/150138311
// version 1.1, written by --Hyde, 30 July 2014
// - see https://productforums.google.com/d/topic/docs/7CaJ_nYfLnM/discussion
// version 1.0, written by --Hyde, 10 August 2013
// - see https://productforums.google.com/d/topic/docs/az365_ypIV0
if (!e.value) {
return;
}
////////////////////////////////
// [START modifiable parameters]
const parameters = [
{
sheetsToWatch: /^(Postcode Checker)$/i,
columnsToWatch: [4,10,11,12],
changelogSheetName: 'APP_logs(RAW)'
},
];
// [END modifiable parameters]
////////////////////////////////
const sheet = e.range.getSheet();
const sheetName = sheet.getName();
const settings = parameters.filter(setting => sheetName.match(setting.sheetsToWatch))[0];
if (!settings || !settings.columnsToWatch.includes(e.range.columnStart) || sheetName === settings.changelogSheetName) {
return;
}
const columnLabel = sheet.getRange(sheet.getFrozenRows() || 1, e.range.columnStart).getValue();
const rowLabel = sheet.getRange(e.range.rowStart, sheet.getFrozenColumns() || 1).getValue();
let changelogSheet = e.source.getSheetByName(settings.changelogSheetName);
if (!changelogSheet) {
changelogSheet = e.source
.insertSheet(settings.changelogSheetName, e.source.getNumSheets())
.appendRow(['Timestamp', 'Sheet name', 'Cell address', 'Column label', 'Row label', 'Value entered']);
changelogSheet.setFrozenRows(1);
}
const pubSearchLogShet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PUB_logs(RAW)");
const col = e.range.getColumn();
if (col == 4){
changelogSheet.appendRow([new Date(), e.value])
}
else if(col == 10 ||col == 11 ||col == 12 ||col == 13 ||col == 14){
pubSearchLogShet.appendRow([new Date(), e.value])
}
}
如果我理解正确,您的目标是将日志中的数据从一个电子表格粘贴到另一个电子表格。
如果是这样,您可以使用 openbyId() 或 openByUrl() 方法轻松引用您通过其 ID 或 URL 创建的另一个电子表格,然后只需使用 setValue() 或 setValues() 方法粘贴数据。
以下面的代码为例:
function onEdit(e) {
if (!e) {
throw new Error(
'Please do not run the onEdit(e) function in the script editor window. '
+ 'It runs automatically when you hand edit the spreadsheet.'
);
}
logColumns_(e);
}
/**
* Automatically logs changes in columnsToWatch in sheetsToWatch.
*
* @param {Object} e The onEdit() event object.
*/
function logColumns_(e) {
// version 1.2, written by --Hyde, 10 February 2022
// - see https://support.google.com/docs/thread/150138311
// version 1.1, written by --Hyde, 30 July 2014
// - see https://productforums.google.com/d/topic/docs/7CaJ_nYfLnM/discussion
// version 1.0, written by --Hyde, 10 August 2013
// - see https://productforums.google.com/d/topic/docs/az365_ypIV0
if (!e.value) {
return;
}
////////////////////////////////
// [START modifiable parameters]
const parameters = [
{
sheetsToWatch: /^(Postcode Checker)$/i,
columnsToWatch: [4,10,11,12],
changelogSheetName: 'APP_logs(RAW)'
},
];
// [END modifiable parameters]
////////////////////////////////
const sheet = e.range.getSheet();
const sheetName = sheet.getName();
const settings = parameters.filter(setting => sheetName.match(setting.sheetsToWatch))[0];
if (!settings || !settings.columnsToWatch.includes(e.range.columnStart) || sheetName === settings.changelogSheetName) {
return;
}
const columnLabel = sheet.getRange(sheet.getFrozenRows() || 1, e.range.columnStart).getValue();
const rowLabel = sheet.getRange(e.range.rowStart, sheet.getFrozenColumns() || 1).getValue();
let changelogSheet = e.source.getSheetByName(settings.changelogSheetName);
if (!changelogSheet) {
changelogSheet = e.source
.insertSheet(settings.changelogSheetName, e.source.getNumSheets())
.appendRow(['Timestamp', 'Sheet name', 'Cell address', 'Column label', 'Row label', 'Value entered']);
changelogSheet.setFrozenRows(1);
}
//const pubSearchLogShet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PUB_logs(RAW)");
// Edited line here:
const pubSearchLogShet = SpreadsheetApp.openByUrl("Introduce the URL of your file here").getSheetByName("Introduce the name of the sheet on that file where you want to have the logs");
const col = e.range.getColumn();
if (col == 4){
changelogSheet.appendRow([new Date(), e.value])
}
else if(col == 10 ||col == 11 ||col == 12 ||col == 13 ||col == 14){
pubSearchLogShet.appendRow([new Date(), e.value])
}
}