【问题标题】:Google Sheet script to set custom number formatting based on cell value用于根据单元格值设置自定义数字格式的 Google Sheet 脚本
【发布时间】:2019-01-07 21:54:10
【问题描述】:

我想根据同一行中另一个单元格的值将单元格格式化为自定义数字格式。例如在A1:U1000 范围内,我想根据单元格G1 的文本值将单元格J1K1 格式化为相同的自定义数字格式。我需要将它传播到几千行。我编辑了一个script 我发现它允许我设置我当前选择的单元格的自定义数字格式,但是我希望在编辑G 列中的值时运行它。我无法将其合并到 onEdit() 函数中。

function testV(){
  setNumberFormat('Volume');
}

function testM(){
  setNumberFormat('Mass');
}

function setNumberFormat(format) {
  var range = SpreadsheetApp.getActiveRange();
  var numberFormat = '';
  try {
    switch (format){
      case 'Volume':
        numberFormat = '##0.00,# in³';
        break;
      case 'Mass':
        numberFormat = '##0.00,# g';
        break;
    }
    range.setNumberFormat(numberFormat);
  } catch (e){
    throw new Error('There was an error: ' + e);
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我为类似的post 创建了一个触发器,可以在此处重复使用。试试这个...

    function onEdit(e) {
      // set the range to monitor for edits 
      var editRange = {
        top : 5, bottom : 20,                                                     // row numbers in search range
        left : 7, right : 7                                                       // column numbers in search range
      };
      var thisRow = e.range.getRow();                                             // find the row number that was changed
        if(thisRow < editRange.top || thisRow > editRange.bottom) return;         // exit if not in these rows
      var thisColumn = e.range.getColumn();                                       // find the column number that was edited
        if(thisColumn < editRange.left || thisColumn > editRange.right) return;   // exit if not in these columns
    
      var shtIn = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("stock");  // set the sheet for the cell that will be formatted 
      var numberFormat = '';
      switch(e.value) {
        case 'Mass':
          numberFormat = '##0.00,# g';
          break;
        case 'Volume':
          numberFormat = '##0.00,# in³'
          break;
      }
      shtIn.getRange(thisRow, 10).setNumberFormat(numberFormat);
      shtIn.getRange(thisRow, 11).setNumberFormat(numberFormat);
    }
    

    这是一个指向 sample sheet 的链接,希望它可以按您的预期工作。

    【讨论】:

    • @Tony,鉴于您的 editRange 将始终在列 G 中,您可以通过删除 left : 7, right : 7 并将您的 thisColumn 检查更改为 if(thisColumn != 7) return; 来压缩它。
    【解决方案2】:

    我能够在原始代码的基础上进行构建以实现预期的结果。它确实对我有用,但它似乎不是很有效。我正在格式化的单元格需要一段时间才能更新。

    var app = SpreadsheetApp;
    var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
    var someCell = activeSheet.getActiveRange().getValue();
    var someRow = activeSheet.getActiveRange().getRowIndex();
    var someColumn = activeSheet.getActiveRange().getColumn();
    
    function onEdit() {
      
      if (someCell == 'Machine 1' && someColumn == '7'){
        setNumberFormat('Mass');
      }
      else if (someCell == 'Machine 2' && someColumn == '7') {
        setNumberFormat('Mass');
      }
      else if (someCell == 'Machine 3' && someColumn == '7') {
        setNumberFormat('Mass');
      }
      else if (someCell == 'Machine 4' && someColumn == '7') {
        setNumberFormat('Volume');
      }
      else if (someCell == 'Machine 5' && someColumn == '7') {
        setNumberFormat('Sheet');
      }
      else if (someCell == 'CAD' && someColumn == '7') {
        setNumberFormat('N/A');
      }
      else if (someCell == '' && someColumn == '7'){
        setNumberFormat('Blank')
      }
    }
    
    function setNumberFormat(format) {
      var rangeMaterial = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(someRow,10);
      var rangeSupport = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(someRow,11);
      var numberFormat = '';
      try {
        switch (format){
          case 'Volume':
            numberFormat = '##0.00,# in³';
            break;
          case 'Mass':
            numberFormat = '##0.00,# g';
            break;
          case 'Sheet':
            numberFormat = '##,# "sheets"';
            break;
          case 'N/A':
            numberFormat = '##,# "N/A"';
            break;
          case 'Blank':
            numberFormat = '##,#';
            break;
        }
        rangeMaterial.setNumberFormat(numberFormat);
        rangeSupport.setNumberFormat(numberFormat);
        
      } catch (e){
        throw new Error('There was an error: ' + e);
      }
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      相关资源
      最近更新 更多