Google Sheet 根据输入文本值排列数据的脚本

Google Sheet Script for arranging data according to input text value

我一直在寻找这个 googlesheet 的脚本。

我想做的是,当我将数据(申请人)输入电子表格时,我希望根据他们的状态自动排列这些数据(申请人)。例如,如果候选人的状态为已聘用或当我将他的状态更改为“已聘用”时,我希望电子表格自动将 candidate/entry 连同详细信息(例如联系人、备注等)放在最后一个订单中.如果申请人的状态是“FLW UP”,我希望电子表格将申请人安排或移动到第一行,以便更容易看到谁需要按顺序首先处理。我希望有人可以为此给我一个脚本。谢谢!

好吧,我最近整理了一些东西来完成这个,因为我还没有找到任何真正的答案。不幸的是,这并不像听起来那么容易。

下面的代码将对您的数据进行排序,同时保留:值、公式、条带、字体样式、背景颜色、注释和(实验性的)验证规则。

尝试:

function onEdit(e) {

  const targetSheet = `YOUR_SHEET_NAME`
  const targetColumn = 1
  const sortBy = [`AppearsFirst`, `...`, `...`, `AppearsLast`]

  if (e.source.getActiveSheet().getName() === targetSheet) {

    if (e.range.rowStart >= 2 && e.range.columnStart === 2 && e.range.columnEnd === 2) {

      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(targetSheet)
      const range = sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn())
      const sortOrder = { ...sortBy }    

      const INIT = {
        Values: range.getValues(),
        Formulas: range.getFormulas(),
        Bandings: range.getBandings(),
        FontStyles: range.getFontStyles(),
        BackgroundColors: range.getBackgrounds().map(row => row.map(cell => (cell === `#ffffff`) ? `` : cell)),
        Notes: range.getNotes(),
        ValidationRules: range.getDataValidations()
      }

      const DATA = INIT.Values.map((i, index) => {
        return {
          RowData: i,
          SortIndex: parseInt(Object.keys(sortOrder).find(key => sortOrder[key] === i[targetColumn-1])),
          Formula: INIT.Formulas[index],
          FontStyle: INIT.FontStyles[index],
          BackgroundColor: INIT.BackgroundColors[index],
          Notes: INIT.Notes[index],
          ValidationRules: INIT.ValidationRules[index]
        }
      }).sort((a, b) => (a.SortIndex - b.SortIndex))

      const SORTED = {
        Values: DATA.map((row, rowIndex) => row.RowData.map((col, colIndex) => row.Formula[colIndex] || col)),
        FontStyles: DATA.map(i => i.FontStyle),
        BackgroundColors: DATA.map(i => i.BackgroundColor),
        Notes: DATA.map(i => i.Notes),
        ValidationRules: DATA.map(i => i.ValidationRules)
      }

      range.setValues(SORTED.Values)
           .setDataValidations(SORTED.ValidationRules)
           .setNotes(SORTED.Notes)
           .setFontStyles(SORTED.FontStyles)
           .setBackgroundColors(SORTED.BackgroundColors)

    }

  }

}

请务必使用适当的值填写顶部列出的这些变量:

const targetSheet = `YOUR_SHEET_NAME`
const sortBy = [`AppearsFirst`, `...`, `...`, `AppearsLast`]
// Example: [`Red`, `Orange`, `Yellow`, `Green`, `Blue`, `Purple`]

根据您发布的 sheet 示例,我已将函数设置为在添加 B2:B 中的任何内容时触发。

请告诉我这是否适合您,或者您可能看到的任何 errors/bugs。

您的代码:

function onEdit(e) {

  const targetSheet = 'LIST'
  const sortBy = ['NEW','FLWUP','RVW PRSCRN','PRSCRN','FON INTVW','SCHED FON','FON CMPLT','PRACT. INTVW','SCHED PRACT.','PRACT. CMPLT','VRB OFFER','REF/BG CHK','HIRED','TBD','UNRESPONSIVE','NO SHOW','WTHDRW','REJECTED',""]

  if (e.source.getActiveSheet().getName() === targetSheet) {

    if (e.range.rowStart >= 2 && e.range.columnStart === 2 && e.range.columnEnd === 2) {

      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(targetSheet)
      const range = sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn())
      const sortOrder = { ...sortBy }    

      const INIT = {
        Values: range.getValues(),
        Formulas: range.getFormulas(),
        Bandings: range.getBandings(),
        FontStyles: range.getFontStyles(),
        BackgroundColors: range.getBackgrounds().map(row => row.map(cell => (cell === `#ffffff`) ? `` : cell)),
        Notes: range.getNotes(),
        ValidationRules: range.getDataValidations()
      }

      const DATA = INIT.Values.map((i, index) => {
        return {
          RowData: i,
          SortIndex: parseInt(Object.keys(sortOrder).find(key => sortOrder[key] === i[1])),
          Formula: INIT.Formulas[index],
          FontStyle: INIT.FontStyles[index],
          BackgroundColor: INIT.BackgroundColors[index],
          Notes: INIT.Notes[index],
          ValidationRules: INIT.ValidationRules[index]
        }
      }).sort((a, b) => (a.SortIndex - b.SortIndex))

      const SORTED = {
        Values: DATA.map((row, rowIndex) => row.RowData.map((col, colIndex) => row.Formula[colIndex] || col)),
        FontStyles: DATA.map(i => i.FontStyle),
        BackgroundColors: DATA.map(i => i.BackgroundColor),
        Notes: DATA.map(i => i.Notes),
        ValidationRules: DATA.map(i => i.ValidationRules)
      }

      range.setValues(SORTED.Values)
           .setDataValidations(SORTED.ValidationRules)
           .setNotes(SORTED.Notes)
           .setFontStyles(SORTED.FontStyles)
           .setBackgroundColors(SORTED.BackgroundColors)

    }

  }

}

按验证列表排序

function onEdit(e){
  e.source.toast('Sorting')
  const sh = e.range.getSheet();
  if(sh.getName() =="Change Sheet Name" && e.range.columnStart == 2 && e.range.rowStart > 1 ) {
    const so = ["HIRED","TBD","UNRESPONSIVE",""];//This is the validation list for column B
    let vs = sh.getRange(2,1,sh.getLastRow() - 1, sh.getLastColumn()).getValues().sort((a,b) => {
      return so.indexOf(a[1]) - so.indexOf(b[1]);
    })
    sh.getRange(2,1,sh.getLastRow() - 1, sh.getLastColumn()).setValues(vs);
  }
  e.source.toast('Completed');
}