【问题标题】:Paste data validation only using Google Apps Script仅使用 Google Apps 脚本粘贴数据验证
【发布时间】:2012-07-26 15:29:13
【问题描述】:

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

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

有什么想法吗?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    添加 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});
    }
    

    【讨论】:

    • mhawksey,你就是男人!添加 optArgument 完全符合我的要求。谢谢!
    【解决方案2】:

    仅作记录,我认为有new validation class可以解决这些问题。

    【讨论】:

      【解决方案3】:

      没有。

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

      【讨论】:

        【解决方案4】:

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

        copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION)

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

        templateRange.copyTo(targetRange);
        

        使用

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

        参考。 range#copytodestination-copypastetype-transposed

        【讨论】:

          【解决方案5】:
          /**
           * 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);
          }
          

          【讨论】:

          • 无意冒犯,但这个网站是说英语的,你不应该用西班牙语写作。。这里很多人的母语不是英语,但他们努力工作!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多