仅使用Google Apps脚本粘贴数据验证

时间:2012-07-27 22:31:54

标签: validation google-apps-script google-sheets

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

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

有什么想法吗?

提前致谢!

5 个答案:

答案 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复制到其上之前阅读所有其他值,公式和格式,然后使用其特定公式(例如, setFormulasetValue等等。基本上只留下模板中的数据验证。

答案 3 :(得分:0)

copyTo有一个变体,仅粘贴数据验证:

copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION)

针对您的具体情况,而不是

templateRange.copyTo(targetRange);

使用

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

参考range#copytodestination-copypastetype-transposed

答案 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);
}