主题
最佳实践
体验优化
通过超链接运行脚本
脚本的运行可以通过超链接触发,绑定方法如下
- 打开插入-链接弹出插入链接配置页面。
- 在文本输入框中填写合适的提示文本,描述该脚本的功能。
- 点击类型旁边的下拉框弹出选项选择AirScript脚本再指定想绑定的脚本。
- 点击确定。
点击插入的超链接即可运行脚本。
通过这种方式,用户所见即所得,相比于打开脚本编辑器点击运行友好很多。
更符合直觉的运行体验
脚本需要选定某些单元格范围时,有多种实现方式,通过Application.Selection
读取并操作用户选中单元格是最符合用户直觉的运行体验。
下面是通过脚本变量划定遍历范围的例子。该例子每次修改范围都需要修改4个变量,非常不方便,体检较差。
javascript
// 错误例子
const startRow = 1
const startColumn = 1
const endRow = 3
const endColumn = 3
for(let i = startRow; i <= endRow; i++){
let row=Application.Rows(i)
for (let j = startColumn; j <= endColumn; j++){
console.log(row.Columns(j).Text)
}
}
下面是通过Application.Selection
获取用户在文档界面选中范围单元格,使用方便并符合直觉。
javascript
// 正确例子
let selection = Application.Selection
for(let i= selection.Row;i<=selection.RowEnd;i++){
let row=Application.Rows(i)
for (let j =selection.Column;j<=selection.ColumnEnd;j++){
console.log(row.Columns(j).Text)
}
}
性能优化
尽可能地复用对象
对Application的每次函数调用会使用到脚本引擎去操作文件数据,重复调用会造成性能浪费。
如同样实现遍历并打印100*100单元格的内容,复用对象能使性能提升一倍。
无复用对象:
javascript
// 错误例子
let start = new Date()
for(let i= 1;i<=100;i++){
for (let j =1;j<=100;j++){
Application.Rows(i).Columns(j).Text
}
}
console.log(new Date()-start,'ms') // 10050 ms
更好的写法:
javascript
// 正确例子
let start = new Date()
for(let i= 1;i<=100;i++){
let row=Application.Rows(i)
for (let j =1;j<=100;j++){
row.Columns(j).Text
}
}
console.log(new Date()-start) // 6720 ms
使用UsedRange缩小遍历范围
上面更符合直觉的运行体验的例子中, 全选整个表格则会进行上万亿次遍历,即使只选中一整行也需要进行上百万次遍历, 但实际上我们单元表中使用到范围并没有那么大。 配合使用Application.ActiveSheet.UsedRange
可以确认工作簿的使用范围,因此大大加快脚本执行时间。
下面是该例子的改进版本:
javascript
const Selection = Application.Selection
const UsedRange = Application.ActiveSheet.UsedRange
// 确定遍历的范围
const rowFrom = Math.max(Selection.Row, UsedRange.Row)
const rowTo = Math.min(Selection.RowEnd, UsedRange.RowEnd)
const colFrom = Math.max(Selection.Column, UsedRange.Column)
const colTo = Math.min(Selection.ColumnEnd, UsedRange.ColumnEnd)
for (let i = rowFrom; i <= rowTo; i++) {
const row = Application.ActiveSheet.Rows(i) // 复用对象
for (let j = colFrom; j <= colTo; j++) {
row.Columns(j).Text
}
}
安全优化
敏感数据不共享
无论是脚本代码还是工作表,都是可共享的,因此敏感数据放在脚本代码或者保存在单元格里是有风险的,脚本执行过程中若需要输入敏感数据,建议通过可视化参数输入,并在脚本中使用Context.argv
读取,避免泄露。
javascript
HTTP.post("https://www.example.com",Context.argv.password)