1

这应该是一个简单的是或否。是否可以使用 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);
}

但是 - 显然 - 复制了数据验证上面行的内容,这不是目标。

有任何想法吗?

提前致谢!

4

5 回答 5

4

添加 optArgument {formatOnly:true} 有效(请参阅参考资料)。所以

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});
}
于 2012-07-28T07:48:52.410 回答
1

仅作记录,我认为有一个新的验证类来解决这些问题。

于 2013-10-02T08:11:40.560 回答
0

不。

但作为一种解决方法,您可以targetRange在将模板复制到其上之前读取您的所有其他值、公式和格式,然后使用它们的特定公式恢复它们,例如setFormulasetValue等等。基本上只留下模板中的数据验证。

于 2012-07-28T03:17:14.767 回答
0

有一个 copyTo 的变体,它只粘贴数据验证:

copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION)

根据您的具体情况,而不是

templateRange.copyTo(targetRange);

采用

templateRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION);

参考。range#copytodestination-copypastetype-转置

于 2019-04-05T19:21:53.453 回答
-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);
}
于 2013-01-27T19:43:40.707 回答