当输入的数据被复制并粘贴到电子表格中时,使用什么触发器来更新单元格? (Google 表格/应用程序脚本)
What trigger to use to update cells when inputted data is copied and pasted into spreadsheet? (Google Sheets/ apps script)
所以我有一个 OnEdit 函数,当用户从列表中选择一种颜色时,单元格背景颜色变为所选值。
这工作正常,但我试图获得在数据被复制并粘贴到传播sheet 以及用户编辑单元格时立即更新单元格背景颜色的功能。目前,当您将数据复制并粘贴到 speadsheet 中时,我编写的用于更改单元格背景颜色的代码不会触发,因为什么都没有 "edited"。我正在尝试让代码为 OnEdit 工作,以及何时将数据复制并粘贴到 sheet。任何想法将不胜感激!谢谢!
这是我目前所拥有的..
// Validates the colours using the above map and changes the cell background to the input colour..
function onEdit(e) {
try {
var range = e.range;
var sheet = range.getSheet();
var tabColumnData = getColumnData(sheet);
if(!tabColumnData.hasOwnProperty('Color')) return;
var col = range.getColumn();
if (col == tabColumnData['Color'] + 1) {
var color = e.value;
if(validateCellValue(color) || COLOR_TO_HEX_MAP.hasOwnProperty(color)) {
range.setBackground(color);
} else {
range.clear();
SpreadsheetApp.getUi().alert('Please select a color from the list or a hex color code.');
}
}
if (col == tabColumnData['Name'] + 1) {
setDataValidation(createColorList());
}
} catch(e) {
Logger.log(e);
}
}
// Sets the data validation when the spreadsheet is opened.
function onOpen(e){
setDataValidation(createColorList());
}
阅读您的问题后,我做出以下假设:
- 您想检测一组单元格何时被编辑。
- 当检测到修改时,您想更改每个单元格的颜色以匹配其内容。
如果我的假设是正确的,您可以使用以下示例来满足您的要求:
代码
function onEdit(e) {
var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
var values = e.range.getValues();
for (var i = 0; i < e.range.getHeight(); i++) {
for (var j = 0; j < e.range.getWidth(); j++) {
try {
e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j)
.setBackground(values[i][j]);
} catch (e) {
// You might want some error handling or logging here
}
}
}
}
行为
每次编辑一个单元格或一组单元格时,代码都会 运行。当检测到版本时,代码将迭代每个单元格并尝试将其背景颜色更改为单元格的内容。
观察结果
- 此代码适用于价差的每个 sheetsheet。要使其专用于 sheet,您应该使用 getSheet 方法s [as getSheetByName()].
- 由于
onEdit
触发器限制,如果修改是由脚本进行的(与用户编辑相反),则此代码不会 运行。
- 在CSS Colour 3. You can check the full list here.
上定义的背景颜色之前,背景颜色是有限的
典故
onEdit(event object)
simple trigger
- Event object
getLastColumn()
/ getLastRow()
getHeight()
/ getWidth()
setBackground(color)
如果有任何其他疑问或要求我进一步说明,请不要犹豫给我回信。
更新
之前的代码将只遍历编辑过的单元格,而不遍历所有 sheet。这种行为将发生在所有 spreadsheet 上。如果您想减少特定范围内的效果(例如 categorycolor 列),您需要一个条件语句来检查修改后的单元格是否在所需范围内。
解决这种情况的第一步是创建一个named range as described here。在此示例中,我使用了名称 ColourRange
,但您可以更改代码以设置您自己的命名范围。将此作为可能的解决方案之一:
function onEdit(e) {
// Colour range
var colourRange = SpreadsheetApp.getActiveSheet().getRange('ColourRange');
var firstColourRow = colourRange.getRow();
var lastColourRow = colourRange.getLastRow();
var firstColourColumn = colourRange.getColumn();
var lastColourColumn = colourRange.getLastColumn();
// Modified range
var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
var values = e.range.getValues();
for (var i = 0; i < e.range.getHeight(); i++) {
for (var j = 0; j < e.range.getWidth(); j++) {
var modifiedCell = e.source.getActiveSheet().getRange(firstRow + i,
firstColumn + j);
if (modifiedCell.getRow() >= firstColourRow && modifiedCell
.getLastRow() <= lastColourRow && modifiedCell.getColumn() >=
firstColourColumn && modifiedCell.getLastColumn() <= lastColourColumn) {
try {
e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j)
.setBackground(values[i][j]);
} catch (e) {
// You might want some error handling or logging here
}
}
}
}
}
所以我有一个 OnEdit 函数,当用户从列表中选择一种颜色时,单元格背景颜色变为所选值。
这工作正常,但我试图获得在数据被复制并粘贴到传播sheet 以及用户编辑单元格时立即更新单元格背景颜色的功能。目前,当您将数据复制并粘贴到 speadsheet 中时,我编写的用于更改单元格背景颜色的代码不会触发,因为什么都没有 "edited"。我正在尝试让代码为 OnEdit 工作,以及何时将数据复制并粘贴到 sheet。任何想法将不胜感激!谢谢!
这是我目前所拥有的..
// Validates the colours using the above map and changes the cell background to the input colour..
function onEdit(e) {
try {
var range = e.range;
var sheet = range.getSheet();
var tabColumnData = getColumnData(sheet);
if(!tabColumnData.hasOwnProperty('Color')) return;
var col = range.getColumn();
if (col == tabColumnData['Color'] + 1) {
var color = e.value;
if(validateCellValue(color) || COLOR_TO_HEX_MAP.hasOwnProperty(color)) {
range.setBackground(color);
} else {
range.clear();
SpreadsheetApp.getUi().alert('Please select a color from the list or a hex color code.');
}
}
if (col == tabColumnData['Name'] + 1) {
setDataValidation(createColorList());
}
} catch(e) {
Logger.log(e);
}
}
// Sets the data validation when the spreadsheet is opened.
function onOpen(e){
setDataValidation(createColorList());
}
阅读您的问题后,我做出以下假设:
- 您想检测一组单元格何时被编辑。
- 当检测到修改时,您想更改每个单元格的颜色以匹配其内容。
如果我的假设是正确的,您可以使用以下示例来满足您的要求:
代码
function onEdit(e) {
var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
var values = e.range.getValues();
for (var i = 0; i < e.range.getHeight(); i++) {
for (var j = 0; j < e.range.getWidth(); j++) {
try {
e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j)
.setBackground(values[i][j]);
} catch (e) {
// You might want some error handling or logging here
}
}
}
}
行为
每次编辑一个单元格或一组单元格时,代码都会 运行。当检测到版本时,代码将迭代每个单元格并尝试将其背景颜色更改为单元格的内容。
观察结果
- 此代码适用于价差的每个 sheetsheet。要使其专用于 sheet,您应该使用 getSheet 方法s [as getSheetByName()].
- 由于
onEdit
触发器限制,如果修改是由脚本进行的(与用户编辑相反),则此代码不会 运行。 - 在CSS Colour 3. You can check the full list here. 上定义的背景颜色之前,背景颜色是有限的
典故
onEdit(event object)
simple trigger- Event object
getLastColumn()
/getLastRow()
getHeight()
/getWidth()
setBackground(color)
如果有任何其他疑问或要求我进一步说明,请不要犹豫给我回信。
更新
之前的代码将只遍历编辑过的单元格,而不遍历所有 sheet。这种行为将发生在所有 spreadsheet 上。如果您想减少特定范围内的效果(例如 categorycolor 列),您需要一个条件语句来检查修改后的单元格是否在所需范围内。
解决这种情况的第一步是创建一个named range as described here。在此示例中,我使用了名称 ColourRange
,但您可以更改代码以设置您自己的命名范围。将此作为可能的解决方案之一:
function onEdit(e) {
// Colour range
var colourRange = SpreadsheetApp.getActiveSheet().getRange('ColourRange');
var firstColourRow = colourRange.getRow();
var lastColourRow = colourRange.getLastRow();
var firstColourColumn = colourRange.getColumn();
var lastColourColumn = colourRange.getLastColumn();
// Modified range
var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
var values = e.range.getValues();
for (var i = 0; i < e.range.getHeight(); i++) {
for (var j = 0; j < e.range.getWidth(); j++) {
var modifiedCell = e.source.getActiveSheet().getRange(firstRow + i,
firstColumn + j);
if (modifiedCell.getRow() >= firstColourRow && modifiedCell
.getLastRow() <= lastColourRow && modifiedCell.getColumn() >=
firstColourColumn && modifiedCell.getLastColumn() <= lastColourColumn) {
try {
e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j)
.setBackground(values[i][j]);
} catch (e) {
// You might want some error handling or logging here
}
}
}
}
}