前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 JavaScript 自动化你的 Mac

使用 JavaScript 自动化你的 Mac

作者头像
IMWeb前端团队
发布2019-12-04 13:09:32
2.3K1
发布2019-12-04 13:09:32
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队

本文作者:IMWeb 吴浩麟 原文出处:IMWeb社区 未经同意,禁止转载 在Apple发布的Yosemite系统(OSX10.10+)中有一个被大家忽略的特性:使用 JavaScript编写自动化脚本。在这之前只能通过AppleScript语言给OS X编写自动化脚本。这几年JavaScript被移植到了各种环境,让它有更多的可能性。

开始使用

系统自带的编写自动化脚本的工具是ScriptEditor。打开编辑器,把语言从 AppleScript切换到JavaScritp。接下来我们就来实战一下,写一个每天自动发新人日报邮件的自动化脚本。具体流程是这样的:

我接到的所有需求都会记录到Reminders里,当我完成一个需求时我会把它标记为已经完成。脚本会每天晚上12点自动读取Reminders里今天完成的Reminders项作为新人日报的今日工作,读取Reminders里还为完成的项作为明日工作。从Reminders里读取内容生成邮件内容后发送到指定的邮箱。

下面直接上代码: 先去Reminders里读取内容,把今天完成的需求项保存到todayReminders数组里,把还为完成的需求项保存到todoReminders数组里

var RemindersApp = Application('Reminders');
var reminders = RemindersApp.lists.byName('Tencent').reminders;
var today = new Date();
//今日完成
var todayReminders = [];
//还没有完成
var todoReminders = [];

//判断date是否为今天
function isToday(day){
    return today.getDate() === day.getDate() && today.getMonth() === day.getMonth() && today.getFullYear() === day.getFullYear();
}

for(var i=0;i<reminders.length;i++){
    var reminder = reminders[i];
    if(reminder.completed()){
        if(isToday(reminder.completionDate())){
            todayReminders.push(reminder);
        }
    }else{
        todoReminders.push(reminder);
    }
}

接下来再生成邮件内容,保存在mailContent变量里

var mailContent = '[今日工作]\n';
for(var i=0;i<todayReminders.length;i++){
    var reminder = reminders[i];
    mailContent+=reminder.name()+' '+reminder.body()+'\n';
}
mailContent+='[明日工作]\n';
for(var i=0;i<todoReminders.length;i++){
    var reminder = reminders[i];
    mailContent+=reminder.name()+' '+reminder.body()+'\n';
}

最后发送邮件

var MailApp = Application('Mail');
var outMail = new MailApp.OutgoingMessage({
    sender:'gwuhaolin@icloud.com',
    subject:'【新人日报】halwu_' + today.getFullYear() + today.getMonth() + today.getDate(),
    content:mailContent,
    visible:false
});
MailApp.outgoingMessages.push(outMail);

编写完代码后点运行按钮就会执行我想要的操作了,再让它每天晚上定时执行我就不用写手写邮件只需要在reminders里更新我的需求就OK啦~ 除此之外我还编写了一个可以每天早上9点自动去公司oa网签到的脚步,让这些流程化的工作全交给程序的自动化处理。

查看文档

ScriptEditor的菜单里点 Window> Library 可以查看到所有支持的APP和提供可供调用的接口的文档

断点调试

当脚本逻辑很复杂时常常会遇到我们无法预料的问题,这时候就需要我们调试找出bug。Safari可以让我们像调试网页js脚本一样调试自动化脚本,具体步骤如下: 在代码的第一行插入一条语句debugger,如下:

debugger
var RemindersApp = Application('Reminders');

再打开Safari,然后运行脚本,Safari的调试工具就会自动打开进入调试模式,剩下就是像调试网页js一样调试了

运行环境

自动化脚本的js环境不兼容ES,只是桥接了大部分API。所以有些js语法和函数会不支持,以下是所有的全局变量:

Infinity: Infinity
$: function()
Application: function()
Array: function()
ArrayBuffer: function()
Automation: {Automation: Object, Progress: Progress, ObjC: Object, __private__: JSValuePrivateProperties}
Boolean: function()
DataView: Function {name: "DataView", prototype: DataView, length: 3, BYTES_PER_ELEMENT: 1}
Date: function()
Error: function()
EvalError: function()
Float32Array: Function {name: "Float32Array", prototype: Float32Array, length: 3, BYTES_PER_ELEMENT: 4}
Float64Array: Function {name: "Float64Array", prototype: Float64Array, length: 3, BYTES_PER_ELEMENT: 8}
Function: function()
Int8Array: Function {name: "Int8Array", prototype: Int8Array, length: 3, BYTES_PER_ELEMENT: 1}
Int16Array: Function {name: "Int16Array", prototype: Int16Array, length: 3, BYTES_PER_ELEMENT: 2}
Int32Array: Function {name: "Int32Array", prototype: Int32Array, length: 3, BYTES_PER_ELEMENT: 4}
JSON: JSON {}
Math: Math {E: 2.718281828459045, LN2: 0.6931471805599453, LN10: 2.302585092994046, LOG2E: 1.4426950408889634, LOG10E: 0.4342944819032518, …}
NaN: NaN
Number: function()
ObjC: {}
Object: function()
ObjectSpecifier: function()
Path: function()
Progress: Progress {}
RangeError: function()
Ref: function()
ReferenceError: function()
RegExp: function()
RemindersApp: undefined
Set: function()
String: function()
Symbol: function()
SyntaxError: function()
TypeError: function()
URIError: function()
Uint8Array: Function {name: "Uint8Array", prototype: Uint8Array, length: 3, BYTES_PER_ELEMENT: 1}
Uint8ClampedArray: Function {name: "Uint8ClampedArray", prototype: Uint8ClampedArray, length: 3, BYTES_PER_ELEMENT: 1}
Uint16Array: Function {name: "Uint16Array", prototype: Uint16Array, length: 3, BYTES_PER_ELEMENT: 2}
Uint32Array: Function {name: "Uint32Array", prototype: Uint32Array, length: 3, BYTES_PER_ELEMENT: 4}
WeakMap: function()
WeakSet: function()
__private__: JSValuePrivateProperties {}
console: {log: function}
decodeURI: function()
decodeURIComponent: function()
delay: function()
encodeURI: function()
encodeURIComponent: function()
escape: function()
eval: function()
isFinite: function()
isNaN: function()
parseFloat: function()
parseInt: function()
unescape: function()

详见Apple官方文档

脱离ScriptEditor,使用你喜爱的编辑器

使用ScriptEditor编写的脚本保存后是.scpt格式的,是以二进制格式存储的非文本文件。接下来介绍如何直接使用你喜欢的编辑器编写js文本并执行。 OSX自带一个自动化脚本解释器叫osascript,AppleScript和JavaScript编写的脚本都需要又他来解释执行,就像node解释执行js文件一样。所以可以按照上面的列子编写js脚本然后在命令行里执行命令:

osascript-l JavaScript/path/to/file.js

或者可以在js文件的顶部加上一行:

#!/usr/bin/env osascript-l JavaScript
然后在chmod +x /path/to/file.js
就可以直接执行这个js文件执行自动化操作了

更多资源

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开始使用
  • 查看文档
  • 断点调试
  • 运行环境
  • 脱离ScriptEditor,使用你喜爱的编辑器
  • 更多资源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档