使用 ECMA-Script / JavaScript 更改 MS-Office / Outlook 日期

Change MS-Office / Outlook dates with ECMA-Script / JavaScript

在 Windows 脚本宿主的 JavaScript 实现中通过 ActiveX 接口访问 Microsoft Office 数据,我注意到您不能将 JavaScript 日期分配给 Office 日期变量.这将导致错误。

例如,如果我想使用以下脚本将当前选定的 Outlook 日历条目的开始时间设置为 "now",这不起作用:

olApplication = new ActiveXObject( "Outlook.Application" ); // call Outlook interface
if ((olApplication.ActiveExplorer().Selection.Count > 0) && (olApplication.ActiveExplorer().Selection.Item(1).Class==26)) { // make sure an appointment-item is selected in Outlook
  now=new Date();
  olApplication.ActiveExplorer().Selection.Item(1).Start = now; /* ERROR thrown */
  olApplication.ActiveExplorer().Selection.Item(1).Save();
}

当我直接读取 olApplication.ActiveExplorer().Selection.Item(1).Start 或任何其他日期字段时,它被转换为本地化字符串。我可以通过为其分配本地化时间值来轻松设置归档日期:

olApplication.ActiveExplorer().Selection.Item(1).Start = "4.5.2017 12:00:00";

但这会破坏不同本地化的脚本,并且格式与 JavaScripts Date.toLocaleString() 实现不兼容。

如何使用 JavaScript 在 Office 尤其是 Outlook 中设置日期?

Office 中的日期有自己的专有类型 "VarDate"(或 VT_DATE),与 JavaScript 日期类型不完全兼容。 可以在此处找到简要文档:https://msdn.microsoft.com/en-us/library/ff520995(v=vs.85).aspx

VarDate 变量可能会造成混淆,因为 JavaScript-dates 中的一些熟悉的东西也适用于它们。因此,您可以用与 JavaScript 日期相同的方式比较 VarDates。

例如,您可以按如下方式比较两个选定的 Outlook 约会的开始时间(假设您已在此处和下方启动了 ActiveX 界面,如问题中的示例所示):

if (olApplication.ActiveExplorer().Selection.Item(1).Start > olApplication.ActiveExplorer().Selection.Item(2).Start) ...

但是,如果您想在 JavaScript 中引入您创建和操作的日期,您需要将其显式转换为 VarData 类型。

幸运的是,Microsoft 通过 Date 对象的 ECMA-Script 实现涵盖了这种情况:https://docs.microsoft.com/en-us/scripting/javascript/reference/date-object-javascript

因此您可以使用 Date 对象的 getVarDate-Method 将日期变量转换为 VarDate 变量。这允许您像这样更改所选 Outlook 约会的开始时间:

var now = new Date();
olApplication.ActiveExplorer().Selection.Item(1).Start = now.getVarDate();

最后,您还可以通过将 VarDate 变量转换为日期对象来使用 JavaScript 的所有日期函数来操作 VarDate 变量。 Microsoft 的 Date-constructor 接受一个 VarDate 变量作为可能的参数:

var outlookAppointmentStartTime = new Date(olApplication.ActiveExplorer().Selection.Item(1).Start);