使用电子表格启动器控件导入联系人

上次修改时间: 2010年10月19日

适用范围: SharePoint Foundation 2010

通过使用 SpreadsheetLauncher 控件,此代码示例可打开通讯簿并将所选联系人导入基于 Microsoft SharePoint Foundation 的网站的联系人列表中。它假定存在调用 ImportFromAddressBook 函数的链接或按钮命令。

<!--Create an AddrBookWrapper object to open the address book and return all information for each contact selected.--> 

<SCRIPT language="VBScript"> 
   Function OpenABW() 
      Dim objAddrBkWrap 
      Dim objContacts 
      Dim objABWOp 

      OpenABW = "" 

      On Error Resume Next 

      Set objAddrBkWrap = CreateObject("MsSvAbw.AddrBookWrapper") 

      If IsObject(objAddrBkWrap) Then 
         objABWOp = objAddrBkWrap.AddressBook(, 1, , , , objContacts, , , True) 

         If objABWOp <> 0 then 
            OpenABW = "" 
         Else 
            OpenABW = ProcessABWCollection(objContacts) 
         End If 

      End If 

      On Error GoTo 0 
   End Function 

<!--Create a SpreadsheetLauncher object to use for import of the data and ensure the object's presence.--> 

   Function EnsureImport() 
      Dim objEnsureImport 

      EnsureImport = 0 

      On Error Resume Next 

      Set objEnsureImport = CreateObject("SharePoint.SpreadsheetLauncher.1")
      If IsObject(objEnsureImport) Then 
         objEnsureImport.EnsureImport() 
      End If 

      On Error GoTo 0 
   End Function 
</SCRIPT> 

<!--Return success or failure of importing contacts.--> 

<SCRIPT language="JavaScript"> 
   function DoImportFromAddressBook()         {
      return OpenABW();                       } 

<!--Iterate through the properties and fields arrays created 
per contact by the ProcessABWCollection function, and create 
the CAML for registering each field and value in the 
Office namespace.--> 
   function XMLSetVars(obj, rgstProps, rgstFields)         {
      var ist; 
      var st = ""; 

      for (ist = 0; ist < rgstProps.length; ist++)         {
         { st += "<SetVar Name=\"urn:schemas-microsoft-      
            com:office:office#" +
            rgstFields[ist] + "\">" + 
            STSHtmlEncode(obj[rgstProps[ist]]) + "</SetVar>";
                                                           }
      return st;                                           } 

<!--Using arrays, assign to each contact item the same properties and 
fields, and construct the CAML code for importing the items via the 
batch manager RPC.--> 
   function ProcessABWCollection(col)         { 

      var rgstProps = new Array("FirstName", "LastName", "SMTPAddress", 
         "CompanyName", "JobTitle", "HomeTelephoneNumber", 
         "BusinessTelephoneNumber", "MobileTelephoneNumber", 
         "BusinessFaxNumber", "BusinessAddressStreet", 
         "BusinessAddressCity", "BusinessAddressState", 
         "BusinessAddressPostalCode", "BusinessAddressCountry", 
         "Body"); 
      var rgstFields = new Array("FirstName", "Title", "Email", 
         "Company", "JobTitle", "HomePhone", "WorkPhone", "CellPhone", 
         "WorkFax", "WorkAddress", "WorkCity", "WorkState", "WorkZip", 
         "WorkCountry", "Comments"); 
      var st; 
      var e = new Enumerator(col); 

   if (e.atEnd()) 
      return ""; 

   st = "<" + "ows:Batch OnError=\"Return\">"; 

   for (; !e.atEnd(); e.moveNext())               { 
      st += "<Method ID=\"0\"><SetList Scope=\"Request\">
         </SetList><SetVar Name=\"Cmd\">Save</SetVar>
         <SetVar Name=\"ID\">New</SetVar>"; 
      st += XMLSetVars(e.item(), rgstProps, rgstFields); 
      st += "<SetVar Name=\"urn:schemas-microsoft-
         com:office:office#WebPage" 
         + "\">" + e.item()["WebPage"] + ", </SetVar>"; 
      st += "</Method>";
                                                   } 
      st += "</ows:Batch>"; 

      return st;                                   } 
</SCRIPT> 

<!--Initiate import of address book contacts and submit items to 
server.--> 

<SCRIPT language="JavaScript"> 
   function ImportFromAddressBook()        { 
      if (0 == EnsureImport())             { 

         st = DoImportFromAddressBook(); 

            if (st.length > 0)                     { 
               FormABWImport.NextUsing.value = window.parent.location; 
               FormABWImport.PostBody.value = st; 
               FormABWImport.submit();             } 
                                           } 
                                           } 
</SCRIPT> 

<!--Define a form for posting the imported data to the server.--> 

<FORM id=FormABWImport method="POST" 
      action="http://STSServer1/Sub1/_vti_bin/owssvr.dll?CS=109"> 
   <INPUT type=hidden name="NextUsing" value=""> 
   <INPUT type=hidden name="Cmd" value="DisplayPost"> 
   <INPUT type=hidden name="PostBody" value=""> 
</FORM> 

请注意,ImportFromAddressBook 函数会先调用 EnsureImport 函数以创建 SpreadsheetLauncher 对象,以便将数据导入到联系人列表。

在 OpenABW 函数中,使用的是 AddrBookWrapper 对象,它是有助于显示浏览和选择通讯簿用户界面 (UI) 的 ActiveX 控件的接口。此对象可实现 MAPISession 对象的 Microsoft 协作数据对象 (CDO) 1.2.1 版本 AddressBook 方法的修改版本。在此示例中,指定了此方法的九个可选参数中的三个。nSelBoxes 参数指定要显示的列表框的数目,并且在此示例中,它只指定一个参数。SelUsers1Contacts 参数为每个所选联系人指定检索的联系人项的集合。fFullInfo 参数包含布尔值 true(指定返回每个联系人的所有信息)。在客户端计算机上安装 Microsoft Office 后,会在 Msosvabw.dll 文件中提供此控件。