VBScript错误:"索引中找不到条目..."何时打开Lotus Notes文件

时间:2014-07-08 05:29:31

标签: vbscript lotus-notes

以下是从Lotus Notes字母中提取附件的工作脚本:

Dim s
s = 1
Do 
s = s + 1
Dim Session 
Dim Maildb 
Dim view 
Dim vc
Dim doc 
Dim Item
Dim coll  
Dim x 
Dim Sender
Dim sentTo
Dim viewTimer
Dim ws
Dim Source
Set Session = CreateObject("Lotus.NotesSession") 
Call Session.Initialize("password") 
Set Maildb = Session.GetDatabase("DOMAIN/Servers/Server-Name/RU", "GroupMail\mailbox.nsf") 
Set view = Maildb.GetView("($inbox)") 


If Not Maildb.IsOpen = True Then 
  Call Maildb.Open 
End If 

With view 
  x = 0 
  ReDim LmailID(x) 
  ReDim HasAttach(x) 
  Set doc = .GetFirstDocument
  If doc Is Nothing Then

  else

    Call doc.PutInFolder("Processed")
    Call doc.Removefromfolder("($inbox)")

      Do 
        fileNames = Session.Evaluate("@AttachmentNames", doc) 

        For Each Filename In fileNames 

          Sender = doc.GETITEMVALUE("From")(0)
          strSearchForSpecificName = "SpecificName"
          If InStr(1, Sender, strSearchForSpecificName) > 0 then
            sentTo = "SpecificName@mail.ru"
          else 
            sentTo = Sender
          End If

          If Filename <> "" Then 
            Call doc.Save( False, False, True )
            Set NotesEmbeddedObject = doc.GetAttachment(FileName)
            NotesEmbeddedObject.ExtractFile ("d:\#files\" + Right("0" & Month(Now), 2) & "-" & Right("0" & Day(Now), 2) & "-"  & Year(Now) & "-" & Hour(Time) & Minute(time) & Second(time) & "_"  & Filename) 
            Set reply = doc.CreateReplyMessage( False )
            Call reply.replaceItemValue("SendTo", sentTo)
            Call reply.replaceItemValue("CopyTo", "copy@mail.ru")
            Call reply.replaceItemValue("Subject", "Re: " & "файл " + Filename + " передан в обработку " + Right("0" & Month(Now), 2) & "-" & Right("0" & Day(Now), 2) & "-"  & Year(Now) & Hour(Time) & ":" & Minute(time) & ":" & Second(time))
            doc.SaveMessageOnSend = True
            Call reply.Send( False )
          End If
        Next
        x = x + 1 
        ReDim Preserve LmailID(x) 
        Set doc = .GetNextDocument(doc) 

      Loop Until doc Is Nothing 
    End If
  End With 

  Wscript.Sleep (30 * 1000)

  Set Session = Nothing
  Set Maildb = Nothing 
  Set view = Nothing 
  Set vc = Nothing
  Set doc = Nothing 
  Set Item = Nothing
  Set coll = Nothing 
  Set x = Nothing

  s = s - 1
Loop While s > 0

问题是我有时会收到错误:错误:&#34;索引中找不到条目......&#34;程序停在设置doc = .GetNextDocument(doc)行。 有没有解决此错误的解决方案?

2 个答案:

答案 0 :(得分:1)

问题很简单:文档已从收件箱中删除,因此不再在索引中。如果其中一个条件成立,则会发生这种情况:

  1. NotesView- Property&#34; AutoUpdate&#34;设置为true
  2. 您的计时器触发&#34; refreshView&#34; - sub(不在您的示例代码中)执行view.Refresh。
  3. 尽管如此,在你的代码中有很多&#34;废话&#34; (遗憾地说),很容易修复此代码:

    只需使用这样一个事实,即视图对象可以更新为优势并更改为&#34; getfirstdocument&#34;一直以来:

    更改此行:

    Set doc = .GetNextDocument(doc) 
    

    这些行:

    Call .Refresh()
    Set doc = .GetFirstDocument 
    

    这是做什么的:Refresh从视图中删除当前处理的文档。 &#34;下一个&#34;文档将是第一个在视图中。你得到的那个,直到没有更多&#34;第一个&#34;文件...

    并且:理查德是对的。您需要将Call doc.PutInFolder("Processed") Call doc.Removefromfolder("($inbox)")下面的两行移动Do,以便将所有文档移动到该文件夹​​而不仅仅是第一个文件夹。

答案 1 :(得分:1)

您的代码正在从$ Inbox中删除第一个文档,因此它不能用作获取$ Inbox中下一个文档的锚点。解决方案通常是确保在删除当前文档之前获取下一个文档。即,改变

Call doc.PutInFolder("Processed")
Call doc.Removefromfolder("($inbox)")

Call doc.PutInFolder("Processed")
set nextDoc = .getNextDocument(doc)
Call doc.Removefromfolder("($inbox)")

并更改

Set doc = .GetNextDocument(doc)

set doc = nextDoc

但是,使用putInFolder和RemoveFromFolder调用的代码实际上并不在循环内,因此只有您处理的第一个文档将被移动到Processed文件夹,并且在循环的第一次迭代后将无法正确设置nextDoc。如果你真的只想将第一个文件移动到Processed文件夹,那么上面的解决方案仍然是正确的,因为你只需要在循环外设置一次nextDoc,你就会有一个无限循环,因为你永远都是将doc设置为相同的nextDoc值。循环中需要另一个nextDoc = getNextDocument(doc)实例。如果您确实希望将所有文档移动到Processed文件夹,那么您只需要移动整个代码块来处理文件夹将nextDoc分配到循环内部。