Skip to content

表格案例

为了帮助您理解AirScript,以及快速上手脚本开发,我们将表格中开始-快捷工具中的部分功能源码展示出来, 希望您能在阅读完这些真实的案例代码后,能有效利用脚本编辑器来解决问题。

清除公式仅保留值

手动选中一个或多个单元格,然后执行脚本,执行完成后会批量清除其公式,仅保留其值。

js
const API = Application

// 用户选区
const selection = API.Selection
// 获取用户激活工作簿的使用范围
const usedRange = API.ActiveSheet.UsedRange

// 取二者的最小集合,即所需遍历最小集合
const rowFrom = Math.max(selection.Row, usedRange.Row)
const rowTo = Math.min(selection.Row + selection.Rows.Count - 1, usedRange.Row + usedRange.Rows.Count - 1)
const colFrom = Math.max(selection.Column, usedRange.Column)
const colTo = Math.min(selection.Column + selection.Columns.Count - 1, usedRange.Column + usedRange.Columns.Count - 1)

for (let i = rowFrom; i <= rowTo; i++) {
  const row = API.ActiveSheet.Rows(i) // 确定行
  for (let j = colFrom; j <= colTo; j++) {
    const rg = row.Columns(j) // 从行对象中指定列,从而确定单元格
    // Text是单元格的显示值,即如果该单元格原先是公式,那Text即公式计算后的结果
    // 如果想获取未计算的结果,使用rg.Formula
    const text = rg.Text
    if (text !== '') {
      rg.Value2 = text // 原先的Value2是公式,通过将Value2重写成计算后的结果从而清除公式
    }
  }
}

高亮错误手机号

手动选中一个或多个单元格,然后执行脚本,脚本会自动判断单元格的内的手机号是否正确,执行完成后会高亮错误手机号单元格。

js
// 手机号码的正则表达式,匹配第一位是1,第二位是3-9,其余位是数字的11位字符串
const PhoneReg = /^1[3-9](\d{9})$/i

// 高亮颜色为黄色
const color = RGB(255, 255, 0)

// API 的简化引用
const API = Application

// 用户选择的区域
const selection = API.Selection

// 工作簿激活的范围
const usedRange = API.ActiveSheet.UsedRange

// 取二者的最小集合,即所需遍历最小集合
const rowFrom = Math.max(selection.Row, usedRange.Row)
const rowTo = Math.min(selection.Row + selection.Rows.Count - 1, usedRange.Row + usedRange.Rows.Count - 1)
const colFrom = Math.max(selection.Column, usedRange.Column)
const colTo = Math.min(selection.Column + selection.Columns.Count - 1, usedRange.Column + usedRange.Columns.Count - 1)

for (let i = rowFrom; i <= rowTo; i++) {
    const row = API.ActiveSheet.Rows(i) // 确定行对象
    for (let j = colFrom; j <= colTo; j++) {
        const rg = row.Columns(j) // 再确定列对象,即确定单元格
        const text = rg.Text  // 获取单元格的文本内容
        if (text !== '' && !PhoneReg.test(text)) { // 正则表达式匹配不通过的情况下
            rg.Interior.Color = color // 用黄色高亮该单元格
        }
    }
}

取消合并填充相同内容

手动选中一个或多个单元格,然后执行脚本,脚本会自动取消合并单元格并填充相同内容。

js
const API = Application
// 用户选择的区域
const selection = API.Selection

// 如果选区内有合并的单元格
if (selection.MergeCells) {
  // 获取所有合并的单元格区域
  const areas = selection.MergeArea.Areas
  const areaCount = areas.Count
  
  // 遍历每个合并的单元格区域
  for (let areaIndex = 1; areaIndex <= areaCount; areaIndex++) {
    const area = areas.Item(areaIndex)
    const text = area.Formula // 保存取消合并前该合并单元格的内容
    
    // 获取合并单元格区域的范围
    const rowFrom = area.Row
    const rowTo = rowFrom + area.Rows.Count - 1
    const colFrom = area.Column
    const colTo = colFrom + area.Columns.Count - 1

    // 取消合并
    area.UnMerge()
    // 将原先合并单元格的区域内容改写成合并单元格的值
    for (let i = rowFrom; i <= rowTo; i++) {
      const row = API.ActiveSheet.Rows(i) // 确定行
      for (let j = colFrom; j <= colTo; j++) {
        const cell = row.Columns(j) // 确定列
        cell.Value2 = text // 将之前保存的内容写到单元格里
      }
    }
  }
}

统计重复次数

手动选中一个或多个单元格,然后执行脚本,脚本会自动计算选区内的重复的值和重复的次数,新建工作表并将重复的值和重复的次数写入新建工作表的A2单元格B2单元格

js
const API = Application
// 用户选择的区域
const selection = API.Selection
// 工作簿激活的范围
const usedRange = API.ActiveSheet.UsedRange

// 取二者的最小集合,即所需遍历最小集合
const rowFrom = Math.max(selection.Row, usedRange.Row)
const rowTo = Math.min(selection.Row + selection.Rows.Count - 1, usedRange.Row + usedRange.Rows.Count - 1)
const colFrom = Math.max(selection.Column, usedRange.Column)
const colTo = Math.min(selection.Column + selection.Columns.Count - 1, usedRange.Column + usedRange.Columns.Count - 1)

// countMap用于统计每个字符串出现次数
const countMap = {}
for (let i = rowFrom; i <= rowTo; i++) {
    const row = API.ActiveSheet.Rows(i) // 确定行
    for (let j = colFrom; j <= colTo; j++) {
        const rg = row.Columns(j) // 再确定列对象,即确定单元格
        const text = rg.Text // 取出该单元格的值用于统计
        if (text) {
            if (countMap[text]) {
                countMap[text]++
            } else {
                countMap[text] = 1
            }
        }
    }
}

const Name = API.ActiveSheet.Name
// 在当前工作表之后新建一个工作表,使用默认名称
const newSheet = API.Sheets.Add(null, API.Sheets(Name), 1)

// 在新工作表的A1和B1写入'重复值'和'重复次数'
newSheet.Range('A1').Value2 = '重复值'
newSheet.Range('B1').Value2 = '重复次数'

// 从第二行开始,每行第一列输出字符串,第二列输出该字符串重复出现的次数
let index = 2
for (let k in countMap) {
    const row = newSheet.Rows(index)
    row.Columns(1).Value2 = "'" + k
    row.Columns(2).Value2 = countMap[k] + ''
    index++;
}