这个应该是一个简单的是或否。是否可以使用Google Apps脚本粘贴数据验证 ?
我想要做的是让代码从活动单元格上方的行复制数据验证,然后将数据验证粘贴到活动单元格的行中。
我试过copyTo:
function updateFormat() {
var rowNumber = SpreadsheetApp.getActiveSpreadsheet().getActiveSelection().getRow();
var rowAbove = rowNumber -1 ;
var targetRange = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(rowNumber, 1, 1, 36);
var templateRange = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(rowAbove, 1, 1, 36);
templateRange.copyTo(targetRange);
}
但是 - 显然 - 复制了上面一行的数据验证和 内容,这不是目标。
有什么想法吗?
提前致谢!
答案 0 :(得分:4)
添加optArgument {formatOnly:true}有效(See Ref)。所以
templateRange.copyTo(targetRange);
变为
templateRange.copyTo(targetRange, {formatOnly:true});
我稍微重构了您的代码并使用以下方法进行了测试:
function updateFormat() {
var sheet = SpreadsheetApp.getActiveSheet();
var rowNumber = sheet.getActiveSelection().getRow();
var rowAbove = rowNumber -1 ;
var maxCols = sheet.getMaxColumns();
var rangeToCopy = sheet.getRange(rowAbove, 1, 1, maxCols);
rangeToCopy.copyTo(sheet.getRange(rowNumber, 1, 1, maxCols), {formatOnly:true});
}
答案 1 :(得分:1)
仅供记录,我认为有new validation class来解决这些问题。
答案 2 :(得分:0)
没有
但作为解决方法,您可以在将targetRange
复制到其上之前阅读所有其他值,公式和格式,然后使用其特定公式(例如, setFormula
,setValue
等等。基本上只留下模板中的数据验证。
答案 3 :(得分:0)
copyTo有一个变体,仅粘贴数据验证:
copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION)
针对您的具体情况,而不是
templateRange.copyTo(targetRange);
使用
templateRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION);
答案 4 :(得分:-1)
/**
* Copia en la fila nueva el formato y validaciones de la fila maestra, es decir,
* la cabecera si index = 1 o la que prefiramos, si no expecificamos index, cuando
* insertamos al final coge de maestra la anterior y al principo coge la siguiente.
* @example function onEdit() { updateRules(); }
**/
function sheetRowRules(index)
{
var spread = SpreadsheetApp.getActive();
var sheet = SpreadsheetApp.getActiveSheet();
var row = sheet.getActiveCell().getRowIndex();
var cols = sheet.getMaxColumns();
if (index)
var i = index;
else if (row > 2)
var i = row-1; // anterior
else
var i = row+1; // siguiente a la cabecera
var rg = sheet.getRange(i, 1, 1, cols);
var rango = sheet.getRange(row, 1, 1, cols);
// Copia el formato del anterior registro al actual y fórmulas de celdas para conservar validaciones de datos
rg.copyTo(rango, {formatOnly:true});
var formulas = rg.getFormulasR1C1().toString().split(",");
//rango.setFormulasR1C1(formulas); // borra los valores, por eso así:
for (var n = 0; n < formulas.length; i++)
{
if (formulas[n].length)
{
var col = n+1;
var rango = sheet.getRange(row, col, 1, 1);
rango.setFormulaR1C1(formulas[n]);
}
}
spread.toast("Formatos y fórmulas del replicados de "+i+" al registro "+row);
}