1

これは簡単にイエスかノーで答えるべきです。Google Apps Scriptだけでデータ検証を貼り付けることはできますか?

私がやりたいことは、アクティブ セルの上の行からデータ検証をコピーし、データ検証をアクティブ セルの行に貼り付けることです。

私は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} を追加すると機能します ( 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});
}
于 2012-07-28T07:48:52.410 に答える
1

記録として、これらの問題を解決するための新しい検証クラスがあると思います。

于 2013-10-02T08:11:40.560 に答える
0

いいえ。

ただし、回避策として、テンプレートをコピーする前に他のすべての値、数式、および書式設定を読み取ってからtargetRange、特定の数式 ( など) を使用してそれらを復元することができます。基本的に、テンプレートからのデータ検証のみを残します。setFormulasetValue

于 2012-07-28T03:17:14.767 に答える
-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 に答える