情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

vCard形式をGoogle CSV形式に変換するスクリプトを書いてみた このエントリーを含むはてなブックマーク

追記:携帯からAndroidに電話帳を移行する場合の詳細な手順を「グループ分けを保ったまま携帯のアドレス帳をAndroidへ移行する方法」にまとめました。参考にしてください。

携帯からGmailに電話帳を移行するときにグループ情報も移行できるスクリプト

スマートフォン(HTC Desire)を買ったので、携帯電話からGmailへ電話帳を移そうと思ったのですが、いくつかの方法を試してみて、グループを移行できないなどの不満がありました。それを解消するために、スクリプトを書きました。Xperiaから電話帳を移行する場合にも同じ問題があるそうなので、グループを移行したいひとは試してみてください

今回は、スクリプトとその使い方がメインですが、携帯電話の電話帳バックアップからGmailへのインポートまでの流れをすべてまとめた記事を書く予定です。そのほかにも、大量のvCardファイルの連結について(←書いた)などの記事を書く予定です。

こんなのもうあるよーとっくにできるよーってことがあるかもしれないんですが、まぁ、せっかく書いてみたので、誰かの参考になれば幸いです。

GmailにvCardを直接インポートする問題点

vCardを変換せずに直接インポートすると、グループ分けが反映されなかったり住所を正しくインポートしてくれなかったりします。これらを解決すべく書いたスクリプトには、次のような利点があります。

このスクリプトを使うメリット

このスクリプトには、GmailへvCard形式を読み込ませたり、Android標準(?)の連絡先アプリからインポートするのに比較して次のようなメリットがあります。

  • GmailへvCardを直接インポートする場合との違い
    • 携帯電話のグループ分けを移行可能
    • ふりがなを移行(名前(フリガナ)、姓(フリガナ)両方、JBook2で読めます)
    • ふりがなに入ってしまうゴミ(;)が入らない
    • 住所をインポートし、郵便番号を先頭に配置する
    • メールアドレス・電話番号の種類を認識可能(サンプルが少ないため不完全)
    • (メリットじゃないけど、誕生日、メモも対応、GmailのvCard読み取りに負けると意味ないので)

VBScriptで作ったことで、次のようなメリットもあります。

  • スクリプト実行用のツールをインストール不要(WSHはいちよまだWindowsの標準のはず)
  • コードが見えるので安心
  • ドラッグアンドドロップで実行可能
  • カスタマイズが簡単。メモ帳で出来る。

使用上の注意

いつものことですが、自己責任でご利用ください。また、Gmailの連絡先にインポートする際には、必ずGoogle CSV形式でバックアップを取ってからインポートしてください。おねがいします。

使い方

今回は、スクリプト自体の使い方のみを説明します。携帯からGmailへの移行全体の手順についてはまた後で書くつもりです。

使うもの

今回は、vCardファイル(.vcf)をGoogle CSV形式ファイル(.csv)に変換するので、携帯電話からバックアップしたvCardファイル(.vcf)を用意してください。.vcfファイルがたくさん発生している場合の対策は次の記事に書きます。

スクリプトファイル作成

次に、実行するスクリプトファイルを作ります。作ると言っても、やることは簡単で、まず、新規のテキストファイル(.txt)を作成してください。そして、その中身に、この記事の下の方にある「スクリプト」の章にあるスクリプト自体をコピーして貼り付けてくださいコピーには、スクリプトの枠の右上に表示されるコピーボタンを使ってください。クリップボードにコピーされます

こうして、中身がスクリプトのテキストファイルを作ったら、そのファイルの名前を「vCard2GoogleCSV.vbs」というファイル名に変更してください。

ファイルの配置

vCard」というフォルダを作成し、その中に携帯からバックアップした「vCardファイル(.vcf)」と、今作った「vCard2GoogleCSV.vbs

スクリプト実行

スクリプトの実行は、vCardファイルをvCard2GoogleCSV.vbsのアイコンにドラッグアンドドロップするだけです。すると、ちゃんと動けば、vCardファイルの名前に「.csv」という拡張子がくっついたファイルがフォルダの中に作成されるはずです。

Google CSVファイル完成

あとは、現在のGmailの連絡先をいったんすべて削除もしものためにGoogle CSV形式でバックアップしておくこと!してから、Gmailの連絡先にインポートしてください。うまくいけば、グループが反映されるはずです。

まとめ

今回は、自分の持っているFOMA SH903iからバックアップしたvCardファイルを参考に作ったスクリプトなので、機種によっては対応していないこともあると思います。ただ、「こんなvCardの形式を投げ込んだら、こんなエラーが出た、こうダメだった」「これもバックアップしたい」と言ってくれれば、気が向く&時間がある&出来そうな範囲でスクリプトを書き直してみるかもしれません。それと、こんなソースコードを貼り付けて配布するのも珍しいかもしれないですが、まぁ、やってみてください^^

今回のスクリプトは、昔に作ったスクリプトを切り貼りした部分があるので、思いっきり無駄なところがあるけど気にしないでください。

スクリプト

肝心のスクリプトです。 コピーする際には、スクリプトの表示されている領域の右上に表示されるアイコンを利用することで、簡単にコピーできます(Chromeでスクリプトの表示が崩れている場合は、InternetExplorerなど、他のブラウザでの表示を試みてください)。

Option Explicit
' ##############################
'
' Global 定数
'
' ##############################
Const CSV_ROWS_MAX = 10000      ' 読み込むvCardファイルの最大"件"数
Const VCARD_LINES_MAX = 1000000 ' 読み込むvCardファイルの最大"行"数
Const MULTIPLEXED_NAME_FAMILY_NAME = True  ' 姓と名を分割できないとき姓(Family Name)にフルネームを設定する
Const MULTIPLEXED_NAME_GIVEN_NAME = False  ' 姓と名を分割できないとき名(Given Name)にフルネームを設定する

' ##############################
'
' Global 変数
'
' ##############################
Dim Key ' Google CSV's Key
Dim Key2Index ' Google CSV's Key to ArrayIndex


' ##############################
'
' 実行
'
' ##############################
Dim ErrorMessage : ErrorMessage = ""
If(Not CheckConfig(ErrorMessage)) Then
  WScript.Echo "エラーメッセージ:" & vbCrLf & ErrorMessage & vbCrLf & vbCrLf & "スクリプトの実行を中止します。"
  WScript.Quit
End If
Call InitializeKey()
Call Main()

' ##############################
'
' 設定(定数)の確認
'
' ##############################
Function CheckConfig(ByRef ErrorMessage)
  CheckConfig = True
  Dim Message : Message = ""
  
  If NOT(MULTIPLEXED_NAME_FAMILY_NAME OR MULTIPLEXED_NAME_GIVEN_NAME) Then
    CheckConfig = False
    ErrorMessage = "MULTIPLEXED_NAME_FAMILY_NAME と MULTIPLEXED_NAME_GIVEN_NAME は少なくとも一方をTrueにしてください。"
  End If
 
End Function

' ##############################
'
' Google CSV 構造準備
'
' ##############################
Sub InitializeKey()
  ' Phone Type = Mobile/Home/Work
  ' Birthday = YYYY-MM-DD
  Key = Array( _
  "Name", _
  "Given Name", _
  "Additional Name", _
  "Family Name", _
  "Yomi Name", _
  "Given Name Yomi", _
  "Additional Name Yomi", _
  "Family Name Yomi", _
  "Group Membership", _
  "Phone 1 - Type", _
  "Phone 1 - Value", _
  "Phone 2 - Type", _
  "Phone 2 - Value", _
  "Phone 3 - Type", _
  "Phone 3 - Value", _
  "E-mail 1 - Type", _
  "E-mail 1 - Value", _
  "E-mail 2 - Type", _
  "E-mail 2 - Value", _
  "E-mail 3 - Type", _
  "E-mail 3 - Value", _
  "Address 1 - Formatted", _
  "Address 2 - Formatted", _
  "Address 3 - Formatted", _
  "Birthday", _
  "Notes")

  Set Key2Index = CreateObject("Scripting.Dictionary")
  Dim i
  For i = 0 To UBound(Key)
    Key2Index.Add Key(i), i
  Next
End Sub

' ##############################
'
' Main
'
' ##############################
Sub Main()

Dim i : i = 0
Dim j : j = 0

Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim strFilePath : strFilePath = GetArg()
Dim strFileName : strFileName = fso.GetFileName(strFilePath)

' ==============================
' vCard 読込
' ==============================
Dim strLines() : ReDim strLines(VCARD_LINES_MAX)
If IsEmpty(strFilePath) Then
  Exit Sub ' 終了
Else
  Call ReadLine(strLines, strFilePath)
End If

' ==============================
' vCard -> CSV 変換処理
' ==============================
Dim CSVRows() : ReDim CSVRows(CSV_ROWS_MAX)
Dim nRow : nRow  = 0
Dim intLineNum : intLineNum = 0
Do While intLineNum <= UBound(strLines)
  If Trim(strLines(intLineNum)) = "BEGIN:VCARD" Then
    ' ==============================
    ' ▼ 一人分の vCard の読込 ▼
    ' ==============================
    Dim Row ' CSV Row
    ReDim Row(UBound(Key))
    For j = 0 To UBound(Row)
      Row(j) = ""
    Next
    Dim nPhone : nPhone = 0 ' 1つのvCardに出てきた TEL の数
    Dim nEMail : nEMail = 0 ' 1つのvCardに出てきた EMAIL の数
    Dim nAddress : nAddress = 0 ' 1つのvCardに出てきた ADR の数
    Dim nVCardLines : nVCardLines = 0 ' 1つのvCardの読み込んだ行数
    Do While True
      ' ==============================
      ' ▼ 1つの プロパティ の読込 ▼
      ' ==============================
      Dim DC : DC = Split(strLines(intLineNum),":")  'DividedByCologne
        ' Quoted Printable 無視
        If InStr(1, strLines(intLineNum), "QUOTED") > 0 Then
          DC = Split("DUMMY:DUMMY",":")  ' Dummy Property
        End If
        If UBound(DC) < 1 Then
          ' WScript.Echo "ERROR : InvalidInput" & vbCrLf & "LINE_NUM : " & intLineNum & vbCrLf & "LINE : " & strLines(intLineNum)
          ' WScript.Echo intLineNum & "行目に、コロン(:)がありません。確認してください。" & vbCrLf & "プログラムを終了します。"
          ' Exit Sub
          DC = Split("DUMMY:DUMMY",":")  ' Dummy Property
        Else
          For i = 2 To Ubound(DC)
            DC(1) = DC(1) & ":" & DC(i)
            ' WScript.Echo intLineNum & ":" & DC(1)
          Next
        End If
      Dim BC : BC = DC(0) 'BeforeCologne
      Dim AC : AC = DC(1) 'AfterCologne
      Dim BCSS : BCSS = Split(BC, ";") 'BeforeCologne Splited by Semicolon
      Dim ACSS : ACSS = Split(AC, ";") 'AfterCologne Splited by Semicolon
      Dim strType : strType = ""
      
      If AC = "" Then
        ' 値のないプロパティを飛ばす
      ElseIf BC = "" Then
        ' 「:」で始まる行を飛ばす
        ' WScript.Echo strLines(intLineNum)
      Else    
        Select Case BCSS(0)
        ' ==============================
        Case "BEGIN" ' VCARDの開始
          
        ' ==============================
        Case "FN" ' フルネーム?
          If GetInfo("Name", Row) = "" Then
            Dim strFullName : strFullName = Replace(AC, ";", "")

            Call AddInfo("Name", Trim(strFullName), Row)
            If(MULTIPLEXED_NAME_GIVEN_NAME) Then Call AddInfo("Given Name", Trim(strFullName), Row)
            If(MULTIPLEXED_NAME_FAMILY_NAME) Then Call AddInfo("Family Name", Trim(strFullName), Row)
          End If
        ' ==============================
        Case "N" ' 名前
          Dim strRawName : strRawName = Replace(AC, ";", "")

          Dim strName : strName = strRawName ' 姓名
          Dim strFamilyName : strFamilyName= "" ' 姓
          If(MULTIPLEXED_NAME_FAMILY_NAME) Then strFamilyName = strRawName
          Dim strGivenName : strGivenName = ""' 名
          If(MULTIPLEXED_NAME_GIVEN_NAME) Then strGivenName = strRawName

          Dim SSName : SSName = Split(AC, ";")  ' SemicolonSplitedName
          If(UBound(SSName) > 0) Then
            If(Len(SSName(0)) > 0 And Len(SSName(1)) > 0) Then
              ' 姓名の判別が可能な場合は再設定
              strName = SSName(0) & SSName(1)
              strFamilyName = SSName(0)
              strGivenName = SSName(1)
            End If
          End If

          Call AddInfo("Name", Trim(strName), Row)
          Call AddInfo("Given Name", Trim(strGivenName), Row)
          Call AddInfo("Family Name", Trim(strFamilyName), Row)
        ' ==============================
        Case "SOUND", "SORT-STRING" ' ふりがな
          Dim WAC : WAC = ConvToWideKatakana(AC)
          Dim strYomiName
          Dim strFamilyNameYomi
          Dim strGivenNameYomi
          Dim SplitFamilyAndGiven : SplitFamilyAndGiven = True
          If SplitFamilyAndGiven Then
            Dim SSSound : SSSound = Split(WAC, ";") ' SemicolonSplitedSound
            If(Ubound(SSSound) = 0) Then
              strYomiName = Replace(WAC, ";", "")
              strFamilyNameYomi = Replace(WAC, ";", "")
              strGivenNameYomi = ""
            ElseIf(Len(SSSound(1)) > 0) Then
              strYomiName = SSSound(0) & SSSound(1)
              strFamilyNameYomi = SSSound(0)
              strGivenNameYomi = SSSound(1)
            Else
              strYomiName = Replace(WAC, ";", "")
              strFamilyNameYomi = Replace(WAC, ";", "")
              strGivenNameYomi = ""
            End If
          Else
            strYomiName = Replace(WAC, ";", "")
            strFamilyNameYomi = Replace(WAC, ";", "")
            strGivenNameYomi = ""
          End If
          Call AddInfo("Yomi Name", Trim(strYomiName), Row)
          Call AddInfo("Given Name Yomi", Trim(strGivenNameYomi), Row)
          Call AddInfo("Family Name Yomi", Trim(strFamilyNameYomi), Row)
        ' ==============================
        Case "EMAIL" ' メールアドレス
          If nEMail < 3 Then
            nEMail = nEMail + 1 
            If InStr(1, BC, ";") > 0 Then
              strType = Split(BC, ";")(UBound(Split(BC,";")))
              If InStr(1, strType, "=") > 0 Then
                strType = Mid(strType, InStr(1, strType, "=") + 1)
              End If
              
              Select Case strType
              Case "INTERNET" : strType = "Home"
              Case "CELL"     : strType = "Other"
              Case "WORK"     : strType = "Work"
              End Select
            Else
              strType = ""
            End If
            Call AddInfo("E-mail " & nEMail & " - Type", strType, Row)
            Call AddInfo("E-mail " & nEMail & " - Value", AC, Row)
          End If
        ' ==============================
        Case "TEL" ' 電話番号
          If nPhone < 3 Then
            nPhone = nPhone + 1
            If UBOUND(BCSS) > 0 Then
              Select Case BCSS(1)
              Case "CELL" ' 携帯電話
                strType = "Mobile"
              Case "VOICE" ' 家の電話
                strType = "Home"
              Case "WORK" ' 会社の電話
                strType = "Work"
              End Select
              Call AddInfo("Phone " & nPhone & " - Type", strType, Row)
            End If
            Call AddInfo("Phone " & nPhone & " - Value", AC, Row) 
          End If
        ' ==============================
        Case "X-GN" ' グループ
          Call AddInfo("Group Membership", AC, Row)
        ' ==============================
        Case "ADR" ' 住所
          If nAddress < 3 Then
            If UBOUND(ACSS) < 5 Then
              Call AddInfo("Address " & nAddress & " - Formatted", Replace(AC,";",""), Row)
            Else
              nAddress = nAddress + 1
              Dim strAdr : strAdr = Split(AC, ";")(1) ' 住所
              Dim strZip : strZip = Split(AC, ";")(5) ' 郵便番号
              If (strZip = "") Or (Len(strZip) <> 7) Then
                Call AddInfo("Address " & nAddress & " - Formatted", strAdr, Row)
              Else
                strZip = Mid(strZip, 1, 3) + "-" + Mid(strZip, 4)
                Call AddInfo("Address " & nAddress & " - Formatted", strZip & " " & strAdr, Row)
              End If
            End If
          End If
        ' ==============================
        Case "BDAY"  ' 誕生日
          Dim strBirthday
          If Len(AC) = 8 Then ' YYYYMMDD
            strBirthday = Mid(AC, 1, 4) & "-" & Mid(AC, 5, 2) & "-" & Mid(AC, 7, 2)
          ElseIf Len(AC) = 10 Then ' YYYY-MM-DD
            strBirthday = AC
          Else
            strBirthday = AC
          End If
          Call AddInfo("Birthday", strBirthday, Row)
        ' ==============================
        Case "NOTE" ' メモ
          Call AddInfo("Notes", AC, Row)
        ' ==============================
        Case "END" ' END:VCARD
          Exit Do
        ' ==============================
        End Select
      End If
      
      
      intLineNum = intLineNum + 1
      nVCardLines = nVCardLines + 1
      
      If nVCardLines > VCARD_LINES_MAX Then
        WScript.Echo "Over " & VCARD_LINES_MAX & " Lines in a single vCard (line:" & intLineNum & ")"
        Exit Sub
      End If
      ' ==============================
      ' ▲ 1つの プロパティ の読込 ▲
      ' ==============================
    Loop
    
    CSVRows(nRow) = Row
    nRow = nRow + 1
    ' ==============================
    ' ▲ 一人分の vCard の読込 ▲
    ' ==============================        
  End If
  intLineNum = intLineNum + 1
Loop


' ==============================
' CSV データ構築
' ==============================
ReDim Preserve CSVRows(nRow - 1)
Dim strOutput() : ReDim strOutput(1 + UBound(CSVRows))
For i = 0 To UBound(strOutput)
  strOutput(i) = ""
Next

' 1行目
For i = 0 To UBound(Key)
  strOutput(0) = strOutput(0) & Key(i) & ","
Next

' 2行目以降
Dim bln
For i = 1 To UBound(strOutput)
  For j = 0 To UBound(Key)
    Dim strValue : strValue = CSVRows(i - 1)(j)
    Dim blnEscaped : blnEscaped = False
    If InStr(1, strValue, """") Then
      strValue = Replace(strValue, """", """""") ' 「"」を「""」に
      blnEscaped = True
    End If
    If InStr(1, strValue, ",") Then
      blnEscaped = True
    End If
    If blnEscaped Then
      strValue = """" & strValue & """"
    End If
    strOutput(i) = strOutput(i) & strValue & ","
  Next
Next

' ==============================
' CSV データ書き出し
' ==============================
Call InputTextFile(strOutput, strFileName & ".csv")

End Sub ' Main()

' ##############################
'
'CSVの行に情報を入力する
'
' ##############################
Sub AddInfo(ByVal strKey, ByVal strValue, ByRef strRow())
  strRow(Key2Index.Item(strKey)) = strValue
End Sub


' ##############################
'
'CSVの行から情報を取り出す
'
' ##############################
Function GetInfo(ByVal strKey, ByRef strRow())
  GetInfo = strRow(Key2Index.Item(strKey))
End Function

' ##############################
'
'ファイルを1行ずつ配列へ入力
'
' ##############################
Sub ReadLine(ByRef strLineArray(), ByVal strFilePath)

Const ForReading = 1  '読み込み

Dim objFileSys : Set objFileSys = CreateObject("Scripting.FileSystemObject")
Dim objInFile : Set objInFile = objFileSys.OpenTextFile(strFilePath, ForReading)

If Err.Number=0 Then
  'ファイルを最後までループ
  Dim strLine : strLine = ""
  Dim i : i = 0
  Do Until objInFile.AtEndOfStream = True
    'ファイルを1行ずつ読み込む
    strLine = objInFile.ReadLine
    If Left(strLine, 1) = " " Then
      ' 前の行の続き
      strLineArray(i - 1) = strLineArray(i - 1) & Mid(strLine, 2)
    Else
      strLineArray(i) = strLine
      i = i + 1
    End If
  Loop
  objInFile.Close

  '配列のサイズを再宣言
  ReDim Preserve strLineArray(i)
Else
  'ファイルの読み込みに失敗した場合
  ReDim Preserve strLineArray(0)
End If

'オブジェクトを廃棄
Set objFileSys = Nothing
Set objInFile = Nothing

End Sub

' ##############################
'
'パラメーターを読み込む
'
' ##############################
Function GetArg()

Dim objArg : Set objArg = Wscript.Arguments

If objArg.Count = 0 Then
  WScript.echo "対象ファイルをドラッグアンドドロップしてください。"
  GetArg = Empty
ElseIf objArg.Count > 1 Then
  WScript.echo "対象とできるファイルは1つのみです。"
  GetArg = Empty
Else
  GetArg = objArg(0)
End If

End Function

' ##############################
'
'新規テキストに、配列の中身を書き込む
'
' ##############################
Function InputTextFile(ByVal strLineArray, ByVal strNewFileName)

Const ForAppending = 8  '追記モード

Dim objFileSys : Set objFileSys = CreateObject("Scripting.FileSystemObject")
Dim strScriptPath : strScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
Dim strCreateFile : strCreateFile = objFileSys.BuildPath(strScriptPath, strNewFileName)
objFileSys.CreateTextFile strCreateFile
Dim objNewFile : Set objNewFile = objFileSys.OpenTextFile(strCreateFile, ForAppending)

Dim counter
For counter = 0 To UBound(strLineArray)
  objNewFile.WriteLine strLineArray(counter)
Next
objNewFile.Close

'オブジェクトを破棄
Set objFileSys = Nothing
Set objNewFile = Nothing
End Function

' ##############################
'
'半角カタカナを全角カタカナに変換する
'
' ##############################
Function ConvToWideKatakana(ByVal strTarget) ' As String
Dim strTemp : strTemp = strTarget
Dim strHanKatakana : strHanKatakana = Array("ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン")
Dim strZenKatakana : strZenKatakana = Array("ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン")
Dim i
For i = UBound(strHanKatakana) To 0 Step -1
  strTemp = Replace(strTemp, strHanKatakana(i), strZenKatakana(i))
Next
ConvToWideKatakana = strTemp
End Function

こんなところまで読んでくださりありがとうございます。もしよろしければコメントか@did2memoにtweetを。vCardサンプル(BIGIN:VCARDからEND:VCARDまで一人分、個人情報に注意)や、使えなかったよ情報を貼り付けていただければ、対応できるかもしれません。あ、そんなじゃなくても、コメント大歓迎です。

更新履歴

  • 2010.05.23 コメント修正
  • 2010.05.23 大きなvCardに対する制限を20行から100行へ拡大
  • 2010.07.14 コロンのない行を発見したときに報告するように変更
  • 2010.07.14 データにコロンが含まれていた場合に対処
  • 2010.07.16 quoted-printableエンコードのプロパティを無視して続行するように変更
  • 2010.07.16 行数の100行制限を10万行制限に変更
  • 2010.09.01 住所の形式が想定外の場合に対応
  • 2010.09.01 行の前後のスペースを無視するように変更
  • 2011.02.14
    • 半角カタカナのふりがなを全角カタカナに変換するようにした。
    • 名前の姓名が分離できるときは分離するようにした。
    • ふりがなの姓名が分離できるときは分離するようにした。
    • 名前の末尾に含まれるスペースを削除するようにした。
  • 2010.02.23 一人分のvCardの制限を100行から1万行へ変更
  • 2011.03.30 コロンで始まる行を無視するようにした
  • 2011.04.09 SORT-STRINGラベルもふりがなとして認識するようにした
  • 2011.05.28
    • 「N」の行にセミコロンが一つもない場合に対応
    • 「N」が存在せず、「FN」のみが存在する場合に対応。ただし、「FN」より「N」を優先する。
  • 2011.07.15
    • 「ADR」の行のセミコロンの数が間違っていても、住所として取り込めるようにした
    • 行数の100行制限を10万行制限に変更
  • 2011.07.26
    • マジックナンバーを、定数変数化した
    • 電話帳の件数の上限を1万件にした
    • 行数の制限を100万件にした
  • 2012.01.09
    • 1件目を飛ばしてしまうバグを修正
    • 名前が二重になってしまって困る指摘が多かったため、名前を二重するかどうかを簡単に設定できるようにした。MULTIPLEXED_NAME_FAMILY_NAMEとMULTIPLEXED_NAME_GIVEN_NAMEを両方Trueにすると名前が二重になり、片方だけTrueにすると、二重にならなくなる。デフォルトはMULTIPLEXED_NAME_FAMILY_NAMEのみTrueで、二重にならない設定
    • 設定の間違いを検出するコード(CheckConfig)を追加

Android | コメント:133 | トラックバック:2 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

この記事のコメント

すみません.
僕はP-09Aユーザーなんですが
そのvCardファイルで試したら

Can't read vCard.Line Number:22と出ました。

これはどうしたらいいんでしょうか??
2010-05-23 Sun 01:11 |  のり [ 編集]
> のりさん
コメントありがとうございます。

>Can't read vCard.Line Number:22
そのエラーメッセージは、「来るべき『BEGIN:VCARD』が予想に反して来なかった」というエラーです。

もしよろしければ、P-09Aから出力したvCardファイルの中身をコメントにコピペしていただけませんでしょうか?もちろん、名前の部分や電話番号などは「名字名前」「09012345678」など、適当に変えてもらって個人情報の見えない形にしていただいて構いません。冒頭の30行分くらいで結構ですので。

vCardファイルは適当なテキストエディタで開くことが出来ます。拡張子を.vcfから.txtにすれば、メモ帳でも開けます。

よろしくおねがいします。

こちらはこちらでちょっとコードをチェックしてみます。
2010-05-23 Sun 01:26 |  did2
> Can't read vCard.Line Number:22
このエラーの原因が、BIGIN:VCARDからEND:VCARDまでの間にある行数を20行に制限していたからである可能性が高いと考え、20行制限を100行制限へ修正しました。

> のりさん
もう一度コードをコピーして.vbsファイルを作成し直し、vCardファイルの変換作業を試みて頂けませんでしょうか。
2010-05-23 Sun 12:58 |  did2
電話帳のメモ欄に特殊記号Ⅲ(ローマ字の3)が記載されていた場合、
以下のように通常とは違う形でVCFファイルが作成されていたため、
スクリプトの107行目で異常終了してしまいました。
(以下は例です)
-----
NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=
91=E5=8D=E3=8Es=8FZ=8Bg=8B=E6=90=99=96
-----

上記例での2行目に”:”が存在しなかったことが異常終了の原因だと思います。
上記のようなデータが出力されてしまうのは文字コード云々が問題なのでしょうが、
詳しいことはわかりませんでした。

該当データを省いたところ、正常にスクリプトを実行することができました。
300件近くのデータをGmail経由でXperiaにインポートするのに
辟易していましたので、非常に助かりました。

スクリプトのさらなる向上を期待しています。
2010-05-27 Thu 02:45 |  hama
> hamaさん
コメントありがとうございます。

> 上記のようなデータが出力されてしまうのは文字コード云々が問題なのでしょうが、
> 詳しいことはわかりませんでした。
サンプルデータありがとうございます。文字コード・エンコードを処理していないのが原因です。他の文字コードや、文字列がエンコードされる場合を想定していませんでした。
対応できるかすぐには分かりませんが、サンプルデータを参考にして修正してみようと思います。

> 該当データを省いたところ、正常にスクリプトを実行することができました。
> 300件近くのデータをGmail経由でXperiaにインポートするのに
> 辟易していましたので、非常に助かりました。
スクリプトが役に立ったようで嬉しいです。ありがとうございます。

> スクリプトのさらなる向上を期待しています。
はい、まずは今回の問題の修正を行いたいと思います。
2010-05-27 Thu 08:02 |  did2
はじめまして。

gmail vcard import フリガナ でネットを探っていてこちらを見つけました。

F906iから出力したVCFで試したのですが、ダイアログに

行 107
文字 13
エラー インデックスが有効範囲にありません。:'[number:1]' コード
コード 800A0009

と出てしまいます。

何が原因でしょうか?
2010-07-07 Wed 13:48 |  だんほる
> だんほるさん
コメントありがとうございます
返信が大きく遅れてしまい申し訳ありません
検証後、対策について報告したいと思います

現時点で分かることとしては、
元となった.vcfファイルを見ないと本当は分からないのですが、
予想外の行がBIGIN:VCARDとEND:VCARDの間にあると推測されます。
BIGIN:VCARDとEND:VCARDの間に:(コロン)の無い行があると、
そのようなエラーが出ると思われます。
もし確認できるようでしたら、テキストエディタで.vcfファイルの中身を
報告していただけると幸いです。

とりあえず、そのような場合に、どの行の読み込み時に問題が発生したかを
確認できるコードを挿入してみようと思います

本当に連絡が遅れてしまい申し訳ありませんでした。
2010-07-09 Fri 15:21 |  did2
申し訳ないだなんてとんでもありません、返信いただけるだけでありがたいですので全然OKです!

とりあえず今のところはF906iのVCFをそのままGmailにインポート→xperiaに同期して使ってます。

そこで気が付いたのは、グループ分けのことはもちろん、なぜか連絡先が重複しているものが何件か出てくること、Gmail側だけフリガナ順に並ばないこと、の3点です。

う~ん、なぜだ・・・

それと同期っていうのは、携帯側、PC側のどちらから編集した場合でも編集した側の内容になるっていうことなんですかね?

なんか話がずれてきてるような気もしますが、アレだったらスルーしてください(笑



2010-07-11 Sun 15:52 |  だんほる
> だんほるさん

> とりあえず今のところはF906iのVCFをそのままGmailにインポート→xperiaに同期して使ってます。
>
> そこで気が付いたのは、グループ分けのことはもちろん、なぜか連絡先が重複しているものが何件か出てくること、Gmail側だけフリガナ順に並ばないこと、の3点です。
>
> う~ん、なぜだ・・・
そうですね、連絡先の重複、ふりがなとグループ分けの問題は私の環境でも発生しました。
連絡先の重複はとくに気にしていないのですが、ふりがなとグループ分けの問題をとりあえず解決するためにスクリプトを作成した次第です。

> それと同期っていうのは、携帯側、PC側のどちらから編集した場合でも編集した側の内容になるっていうことなんですかね?
はい、そうなります。絶妙なタイミングで複数箇所から編集したらどうなるかとかは分かりませんが^^;


あ、早くスクリプトを編集して、おかしなところを検出できるようにしてみますね。OSを入れ直している内にいろいろありまして(←言い訳

ということで、これは寝るまでにやって反映します!
2010-07-14 Wed 20:25 |  did2
> だんほるさん
エラーの詳細が分かるように、エラーの原因と思われる部分に、エラーが起こった行を報告するコードを追加しました。もう一度試すことで、エラーの原因となっている行が特定できると思います。
2010-07-14 Wed 22:55 |  did2
> だんほるさん

コメント中の文字列が、固有名詞を含んでいる文字列を変換した物だったので、該当のコメントを削除し、伏せ字(=)を使って書き直してここに掲載しておきます。個人情報というほどではないのですがとりあえず。

以下、だんほるさんからのコメントです

> お忙しいところありがとうございます!
>
> 以下、エラーのダイアログです。
>
> ERROR:InvalidInput
> LINE_NUM:2226
> LINE:============================================================
>
> 「2226行目に、コロン(;)がありません。確認してください。」
>
> と出ました。
>
> ちなみにエクセルにコピペして2226行目を見ると、
> NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=
> 2227行目が、
> ============================================================
>
> でした。
>
> どうでしょう?
2010-07-15 Thu 23:56 |  did2
> だんほるさん

おかげさまで、とりあえずエラーが発生した原因を特定することが出来ました。Quoted-Printableという形式にスクリプトが対応していないため、Note(メモ)を読み込む際にエラーになっていたようです。とりあえず、メモくらい無くっても大丈夫に違いないという前提のもと、Quoted-Printableエンコードされている部分を無視して、エラーが発生しても強制的に続行するようにしてしまおうと思います。それで名前やらグループやらが無事に変換できていればいいのですが。

これは応急処置で、Quoted-Printableに対応できたときには、そちらでもう一度変換していただけたらなぁと思います。
2010-07-16 Fri 00:03 |  did2
> だんほるさん

> Quoted-Printableエンコードされている部分を無視して、エラーが発生しても強制的に続行するようにしてしまおうと思います。
この通りにスクリプトを変更しました。quoted-printableが原因のエラーをとりあえず無視するように変更しました。quoted-printableがどこに出てくるのか正しく把握できていないのでとにかくquoted-printableという文字が出てきた行を無視して、コロンが無い行も無視してしまっています。QUOTEDさんがもし電話帳に登録されていたら無視されるのでご注意ください^^;
2010-07-16 Fri 01:24 |  did2
夜遅くまでありがとうございます!

QUOTEDさんは居ませんでしたので大丈夫そうです(笑

しかし・・・今試したのですが、またなんか出てきました・・・
以下ダイアログの内容です。

Over 100 Lines in a single vCard (line11908)

ちなみに、11908行目は
xLb6lb8RTHDKOx7irS1RzyVtT58/bG8NJBqumeJraLaJM29wyjq2MoT+GRXhVk0hYBxwCQT7

でした。

たびたび恐れ入ります(;^ω^)
2010-07-16 Fri 10:08 |  だんほる
> Over 100 Lines in a single vCard (line11908)
これは、「一人分の情報が100行分もあるわけ無いだろう、
もし100行分もあったとしたら、それはどこかで間違えただけのはず、
エラーとして停止しよう」という考えに基づいたエラーです。

> xLb6lb8RTHDKOx7irS1RzyVtT58/bG8NJBqumeJraLaJM29wyjq2MoT+GRXhVk0hYBxwCQT7
これを見る限り、この行は、画像データ(をBase64エンコーディングしたもの)の一部ではないかと思います。
画像を文字にしたら100行くらい越えちゃいますよねってことです。自分は画像を使ったことがなかったのであまり考えていませんでした。電話帳に、顔写真のようなデータを関連づけている人が居ると思います。
(11908行目から上方向に進んでいくと、きっとその人の名前が見つかると思います)

残念ながら画像対応はなかなか難しいので、これまたとりあえず無視してしまおうと思います^^;
暫定的な処置として、その適当すぎる100行制限を10,000行制限にしてみます。

なんどもお手数かけますが、おかげさまで少しずついろいろ分かってきたのでスクリプトを改善できそうです。ありがとうございます。

もしよろしければ、
> xLb6lb8RTHDKOx7irS1RzyVtT58/bG8NJBqumeJraLaJM29wyjq2MoT+GRXhVk0hYBxwCQT7
この謎の文字列の行から上にたどっていただいて、この謎の行たちが始まる直前の行にどんなことが書かれているか見つけられましたら報告をお願い致します。よくわからなかったら気にしないでください。予想では、Base64という文字が含まれていたり、画像っぽい英単語が含まれている行があると思います。その行さえ分かれば、とりあえず画像データのはじまりの位置が特定できるようになりますので。
2010-07-16 Fri 12:22 |  did2
1万行制限にするつもりがなんとなく10万行制限になりましたが。とりあえず100行の制限はとりのぞけたはずです。手元に.vcfファイルが無いのでテストできていないのですが、「100」って書いてあったところを「100000」にしただけなので、今までと同じ程度にはまともに動くと思います。

次こそうまくCSVファイルが出来ることを願っています。
2010-07-16 Fri 12:38 |  did2
お疲れ様です。

CSVファイルできました!!
グループ反映されてます!!

did2さんが仰られた通り、11828行目に
PHOTO;TYPE=JPEG;ENCODING=BASE64:
11829行目から12275行目まで、写真の内容であろう英数字の羅列が並んでいました。
電話帳内で写真を関連つけているのはその一人だったのでこうなったのでしょうね。

あとはただ、フリガナ順に並んでませんでした・・・
電話帳の内容を見てみると、フリガナの欄が姓と名に分かれていてそれぞれに「ヤマダタロウ」「ヤマダタロウ」(仮名)と入っていました。
とりあえずすぐに消して元に戻したので、Xperia側は確認してません。
F906iの電話帳がそもそも姓と名に分かれた仕様だったからでしょうか。

もうそろそろほぼ放置プレイでも構いませんので、テキトーなペースでやってくださいね(;^ω^)
2010-07-16 Fri 15:03 |  だんほる
> CSVファイルできました!!
> グループ反映されてます!!
やった♪よかったです

> did2さんが仰られた通り、11828行目に
> PHOTO;TYPE=JPEG;ENCODING=BASE64:
> 11829行目から12275行目まで、写真の内容であろう英数字の羅列が並んでいました。
> 電話帳内で写真を関連つけているのはその一人だったのでこうなったのでしょうね。
やはりそうでしたか。


ふりがなについては、ちょっといろいろ補足説明が必要ですね^^;


> あとはただ、フリガナ順に並んでませんでした・・・
GMailの連絡先でしょうか?GMailの連絡先は、私の知る限りではふりがなをどんなに登録してもふりがな順に並べることは出来ないと思います。なので、ふりがなはAndroid側での利用が目的です。PC上のGMailなら名前やらアドレスやらを入力してしまう方が早いので今のところ気にしていません。

> 電話帳の内容を見てみると、フリガナの欄が姓と名に分かれていてそれぞれに「ヤマダタロウ」「ヤマダタロウ」(仮名)と入っていました。
これはこのエントリにちょこっと出てくる「JBook2(http://jbook2.rocmok.com/)」というAndroid電話帳アプリでの利用を想定していて、「Android OS 2.0以降について(http://jbook2.rocmok.com/api5)」に記されているとおりに2種類のふりがな(Yomi NameとFamily Name Yomi)を用意した結果です。私はDesireで、Android 2.1でしか試していないのですが、XperiaにJBook2をインストールすれば利用できる・・・かもしれないです。JBook2はとても便利に使っています。

> とりあえずすぐに消して元に戻したので、Xperia側は確認してません。
Xperiaの標準電話帳アプリも「Yomi Name」を認識するタイプらしいので、同期を行えばXperiaの標準電話帳アプリからも認識できると思います(XPERIA-連絡先のgoogle(Gmail)同期とフリガナ振り分け http://www.witkitty.com/wordpress/2010/04/03/xperia-gmail-sync/ より)。

> もうそろそろほぼ放置プレイでも構いませんので、テキトーなペースでやってくださいね(;^ω^)
はい、今もうすでにてきとーなペースです(笑
2010-07-16 Fri 17:12 |  did2
使わせていただこうと思いまして指示されたようにスクリプトなどを用意し実行じてみたのですがエラーが出てしまいました。もしよかったら助けてください。よろしくお願いします。

行 1
文字 1
エラー 文字が正しくありません
コード 800A0408
ソース Microsoft VBScriptコンパイルエラー
2010-08-13 Fri 23:24 |  はじめまして
コメントありがとうございます

作成した.vbsファイルの中身をメモ帳などのテキストエディタで開いて確認してみてください。
なにか余計な文字が最初に含まれてしまっていることが考えられます。
スクリプトの中身と見比べて、余計な文字や行が入ってしまっていませんか。

余計な文字が入らないようにするために、コードが表示されている部分にマウスを当てると右上に表示されるアイコンから「copy to clipboad」をクリックしてコピーするといいと思います。新規ファイルにそのまま貼り付けてください。

また何かあればコメントお願いします。

2010-08-13 Fri 23:36 |  did2
こんなにも早く返信がいただけるなんて本当にありがとうございます。
余計な文字が入らないようにcopy to clipboadからコピーしたのですが・・・

念のため、vbsファイルの上から数行をコピペします。よろしくおねがいします。

Option Explicit
' ##############################
'
' Global 変数
'
' ##############################
Dim Key ' Google CSV's Key
Dim Key2Index ' Google CSV's Key to ArrayIndex


' ##############################
'
' 実行
'
' ##############################
Call InitializeKey()
Call Main()

2010-08-14 Sat 00:01 |  はじめまして
本当に申し訳ありませんでした。

メモ帳を開いてるつもりが確認せずずうとワードパッドを使ってました。
そりゃあ出来ないですよね↓↓

なので無事にできました!!この変換ソフト便利すぎます!!
これからも記事読ませていただきます♪
2010-08-14 Sat 00:17 |  はじめまして
全くエラーの起こる原因が分からなくてうーん・・・と考え込んでしまいました(笑

無事にスクリプトを実行できたようで良かったです
今後ともよろしくお願いします
2010-08-14 Sat 00:20 |  did2
お世話になっています、uguといいます。
こちらのスクリプトを試させていただいたところ、
インデックスが有効範囲内に有りません。
というエラーがでます。
エクセルで調べた中身は舌のようでした。
BEGIN:VCARD
VERSION:2.1
N;CHARSET=Shift_JIS:名前
SOUND;X-IRMC-N;CHARSET=Shift_JIS:フリガナ
TEL;CELL:電話番号
EMAIL:アドレス
ADR;HOME;CHARSET=Shift_JIS:;住所
END:VCARD

よろしければご教授お願いいたします。
2010-09-01 Wed 17:22 |  ugu
> uguさん
コメントありがとうございます

エラーの文面と、vCardの中身とを検証した結果、二つの原因が推定されたので、それぞれ対応してみました。

1つめは、vCardの行末に空白がある場合についてで、読み込み時に空白を無視するようにしました。

2つめは、住所の形式についてです。
コメントしていただいた例では、住所の部分が
> ADR;HOME;CHARSET=Shift_JIS:;住所
となっています。
この形式では、コロンの後、セミコロンが1つしか有りません。

私の手元の環境と、いままでスクリプトを利用してくださった方々は、おそらく
セミコロンが5つ以上あったと思われます。

このセミコロンの数の不一致により今回の
> インデックスが有効範囲内に有りません。
というエラーが発生したと推定しました。

そこで、もしセミコロンが少ない場合であっても読み込めるようにスクリプトを変更いたしました。


このまま正しく動作するかまだ分かりませんが、もう一度試してみてください。

もし再びエラーが発生してしまった場合には、エラーメッセージの
「行」「文字」「エラー」
の3つをセットにしていただけると助かります。


今後のための補足説明:
今までのスクリプトでは、ADRの行のコロンより後ろを、「;住所;;;;郵便番号(ハイフン無し);」と仮定していました。今回はその仮定を少し弱めてあります。
2010-09-01 Wed 21:02 |  did2
早速の対応、心より御礼申し上げます!
正にお察しの通りでした。上手くいきました。

ありがとうございました。
2010-09-02 Thu 01:57 |  ugu
> 早速の対応、心より御礼申し上げます!
> 正にお察しの通りでした。上手くいきました。
uguさん、報告ありがとうございます!

よろしければ、今後の、誰かの参考のために、何という機種の携帯電話からバックアップしたvCardファイルで問題が発生したのかをコメントしていただけないでしょうか。もちろん、まだこのコメント欄をチェックしていただけていたらの話ですが(^-^;
2010-09-02 Thu 17:55 |  did2
auで,W61S→IS03へ移行する際,こちらのスクリプトを多少修正して使わせていただきました.

ありがとうございました.
2010-12-04 Sat 01:12 |  はる [ 編集]
> はるさん
コメントありがとうございます

修正して使ってもらえるとは思っていませんでした。
コードが役に立ったようで良かったです。ありがとうございます。
2010-12-04 Sat 14:32 |  did2
実行してGoogleの連絡先に入れてみたところ、名「名字+名前」、姓「名字+名前」といった具合に二重で名前が表示されました。
iPod上でも同期するのできちんと名「名前」、姓「名字」となるようにしたいのですが解決策はありますでしょうか。
よろしくお願い致します。
2011-02-10 Thu 03:52 |  Hyla
> Hyla さん
コメントありがとうございます

> 実行してGoogleの連絡先に入れてみたところ、名「名字+名前」、姓「名字+名前」といった具合に二重で名前が表示されました。
> iPod上でも同期するのできちんと名「名前」、姓「名字」となるようにしたいのですが解決策はありますでしょうか。

とのことですが、解決できる可能性はあります。

しかし、もともとこうしたのは、私の環境では名字と名前を分離できなかったためです。
Hylaさんは携帯に名前を登録するときに、名字と名前の間に区切り文字(全角・半角スペースなど)を入れていましたか?もし入れていたのであれば、比較的簡単に分離できるかもしれません。入っていないと、どこまでが名字だか分からないので非常に難しいです。私はスペースなどの区切りを何もを入れていなかったので断念しました。

もしくは、携帯電話の電話帳が「名字」と「名前」に分かれていますか?もし分かれていれば、分離できる"かも"しれません。ただし、多少変更点が大きくなると予想されるので、修正に比較的時間がかかるかもしれません。

ちなみに、以上はあくまで私の"予想"で、修正を行ってみても直らないかもしれない点(iPodがどうなるか分からないので)にはご注意ください。

(以下参考)
修正予定は
' ==============================
Case "N" ' 名前
Dim strName : strName = Replace(AC, ";", "")
Call AddInfo("Name", strName, Row)
Call AddInfo("Given Name", strName, Row)
Call AddInfo("Family Name", strName, Row)
' ==============================
と書かれた部分です。(ふりがなは別途)
2011-02-11 Fri 08:45 |  did2
did2さん

丁寧なご回答ありがとうございます。
私の場合、もともとsoftbankの934SHを使用しておりまして、VCFでは名字+名前が分離されてそれぞれにフリガナが入っておりました。

もともと分かれているの「名字」、「名前」にフリガナだけさえ残した形でCSVに変換できれば幸いです。

デフォルトのスクリプトで作ったCSVファイルをインポートした場合、Googleの連絡先の表示では「名字+名前」の合わさった表示のみがされていますが、右側の[…](←こんなボタン)をクリックして表示してみると、名「名字+名前」、姓「名字+名前」と二重に表示されています。
恐らくGoogle側で重複したものを表示しないようになってるんですね^^


2011-02-11 Fri 18:28 |  Hyla
> 私の場合、もともとsoftbankの934SHを使用しておりまして、VCFでは名字+名前が分離されてそれぞれにフリガナが入っておりました。
>
> もともと分かれているの「名字」、「名前」にフリガナだけさえ残した形でCSVに変換できれば幸いです。
そうでしたか、それなら何とかなるかもしれませんね。
サンプルとして一人分のVCFファイルの中身を貼り付けてもらえますか?もちろん個人情報を隠すように内容は変更して、です。それを参考にして、対応したバージョンが作れるかやってみようかと思います。

> 恐らくGoogle側で重複したものを表示しないようになってるんですね^^
ほんとですね、名字をちょっと変えたりしたら、名字と名前が両方出現しました。よくあることなんでしょうね。
2011-02-11 Fri 21:38 |  did2
>対応したバージョンが作れるかやってみようかと思います。
わーほんとにありがとうございます><
VCFをメモ帳で開いてみるとこんな感じでした。
///
BEGIN:VCARD
VERSION:2.1
N;CHARSET=SHIFT_JIS:山田;花子;;;
SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:ヤマダ;ハナコ;;;
TEL;CELL:09012345678
TEL;CELL:
TEL;CELL:
TEL;CELL:
TEL;CELL:
EMAIL;CELL:sample@docomo.ne.jp
EMAIL;CELL:
EMAIL;CELL:
EMAIL;CELL:
EMAIL;CELL:
ADR;HOME;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:;;;;;;
TITLE;CHARSET=SHIFT_JIS:
NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:
URL;HOME:
X-GNO:3
X-GN;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=sample20univ.
X-CLASS:PUBLIC
BDAY:
END:VCARD
///
よろしくお願い致します。
2011-02-11 Fri 22:57 |  Hyla
> Hyla さん
スクリプトを変更してみました。

まず、名前とふりがながセミコロンで分離されている場合に、「姓」「名」に分けてCSVファイルを作成するように変更しました。分離されていないときは以前と同様に動作します。
また、このとき、ふりがなが半角カタカナのままだとGoogle連絡帳に取り込んだときに文字化けしてしまうことがわかったので、ふりがなについては半角カタカナをすべて全角カタカナに変換するように変更しました。

今回、GMail(Google連絡帳)への取り込みが正しく行われているかを目視で確認しましたが、実際に読み取るアプリケーション次第で、どの部分のデータを取ってくるかが異なるため、iPodならiPodで使ってみないとどうなるかは分かりません。お試しください。

(以下、その他の利用者向けの注意書き)
このスクリプトはもともとJBook2での利用を想定して作っていたので、もしかすると、JBook2ではうまく読み取れなくなってしまっている部分があるかもしれません(ちょっと手軽に検証できる環境がなく、検証できていません)。もし不具合を発見したらコメントをお願いいたします。
2011-02-14 Mon 03:50 |  did2
>did2さん
無事に解決しました!
ほんとにありがとうございました。
これで安心してAndroidにも移行できそうです^^

P.S.
瑣末なことですが、最初スクリプトエラーが出たのでなぜかと考えていたらブログ上のスクリプト一行目のOption Explicitが二行書かれておりました。
何も考えずにコピペだけしたらそりゃ動かないですね^^;
参考まで。
2011-02-14 Mon 15:27 |  Hyla
> 無事に解決しました!
> ほんとにありがとうございました。
> これで安心してAndroidにも移行できそうです^^
うまくいったみたいでよかったです^-^

> 瑣末なことですが、最初スクリプトエラーが出たのでなぜかと考えていたらブログ上のスクリプト一行目のOption Explicitが二行書かれておりました。
ありがとうございます。コードを置き換えるときに、古いコードの1行目を消し損ねていたようです。修正しておきました。
2011-02-14 Mon 16:42 |  did2
どうも初めまして^^
さっそくで申し訳ないのですが少し不具合が…
上記のコメに100行制限は外れたとおっしゃっているものがありますが、まだ同種類のエラーが出てしまいます;
どうしたら解決できるのでしょうか?
2011-02-22 Tue 19:35 |  yanbaru [ 編集]
> yanbaru さん
コメントありがとうございます。

> 上記のコメに100行制限は外れたとおっしゃっているものがありますが、まだ同種類のエラーが出てしまいます;
表示されるエラーメッセージが同じでも、エラーの原因は別にあるかもしれません。
"同種類のエラー"とのことですが、具体的なエラーメッセージは何ですか?
原因を推測してみたいと思います。
2011-02-23 Wed 00:30 |  did2
迅速な返信感謝いたします。
Over 100 Lines in a single vCard (line3467)
と出ます。lineだけが違うようです…。
ご検証の結果お待ちしております。
2011-02-23 Wed 06:23 |  yanbaru [ 編集]
> Over 100 Lines in a single vCard (line3467)
とりあえず、一人あたりのvCardの長さの制限を100行から1万行に変更しました。
もう一度お試しください。
2011-02-23 Wed 07:43 |  did2
無事、起動いたしました!
丁寧な対応ありがとうございますm(__)m
2011-02-24 Thu 06:12 |  yanbaru
> 無事、起動いたしました!
> 丁寧な対応ありがとうございますm(__)m
すぐに直すことが出来たようで良かったです!
2011-02-24 Thu 22:06 |  did2
使わせていただきました。
ありがとうございます!

無事にVCFファイルがCSVになったのですが、G-mailの電話帳に取り込むと文字化けしてしまいます。
この対策方法はありますでしょうか?

すみませんが、アドバイス頂けませんか?
2011-03-22 Tue 22:58 |  Ange
> Angeさん
コメントありがとうございます

> 無事にVCFファイルがCSVになったのですが、G-mailの電話帳に取り込むと文字化けしてしまいます。
> この対策方法はありますでしょうか?

前回スクリプトを変更したときに、CSVファイル中に半角カタカナが入っていると、G-mailへ取り込んだときに文字化けが発生しました。どこかに半角カタカナがあるのかもしれません。前回は、ふりがなに半角カタカナが有った場合に文字化けが発生したので、ふりがなに関してのみ対策済みで、その他については今のところ未対策です。

文字化けしたのは全員ですか?それとも文字化けしなかった人も居ますか?
また、文字化けした人の中に、住所やメモ欄、名前などなど、どこかしらかに半角カタカナを含んでいるなんてことはありませんか?
どこに文字化けが含まれているのかを特定したいと思います。

もし、実際に半角カタカナが原因のようなら、該当箇所において半角カタカナを全角カタカナに変換するようにスクリプトを変更してみたいと思います。上記のチェックをよろしくお願いします。
2011-03-23 Wed 13:55 |  did2
エラーがでてこまっています。
600件以上あるので、どうしても使いたいのです。
どうぞよろしくおねがいします。

行:134
文字:5
エラー:インデックスが有効範囲にありません。:「number:0」
コード:800A0009
ソース:Microsoft VBScript 実行時エラー



BEGIN:VCARD
X-SD-VERN:1.0
X-SD-FORMAT_VER:2.1
X-SD-CATEGORIES:BACKUP
X-SD-CLASS:PRIVATE
X-SD-DCREATED:2011-03-25T13:05:54+09:00
X-SD-CHAR_CODE:SHIFT-JIS
X-SD-DESCRIPTION:20110325130553
BEGIN:VCARD
VERSION:2.1
X-FJ-NO:
X-CLASS:PUBLIC
N;CHARSET=SHIFT_JIS:katey;;;;
SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:ケイティ;;;;
URL:
BDAY:
ADR;HOME:;;;;;;
NOTE:
ORG:;
TITLE:
X-FJ-PI:-1
X-REDUCTION:
X-NO:
TEL;CELL:09012345678
TEL:
TEL:
TEL:
TEL:
EMAIL;INTERNET:11@docomo.ne.jp
EMAIL;INTERNET:
EMAIL;CELL:
EMAIL;CELL:
EMAIL;CELL:
PHOTO:
X-DCM-HMN-MODE:
X-DCM-DATALINKID:
X-DCM-ADR:
X-DCM-URL:
X-DCM-NOTE:
END:VCARD
2011-03-29 Tue 02:30 |  katey [ 編集]
> kateyさん
コメントありがとうございます

> エラーがでてこまっています。
> 600件以上あるので、どうしても使いたいのです。
わかりました。
今日の夜、スクリプトの内容をチェックしてみます。
2011-03-29 Tue 12:45 |  did2
ありがたく使わせていただきました。
しかし、以下の現象が起きて困っております。
Name Given Name にフルネーム
Yomi Name にフルネーム
Given Name Yomi は 空
VCFファイルをテキストで開いてみたら、
JIS:の文字の後に区切り文字なくフルネームが(同じくSHIFT_JIS:フルネーム)機種によっては区切り文字があるのでしょうか。それともどこかで区切り位置の情報を持っており対応出来ますでしょうか。

宜しくお願いします。

BEGIN:VCARD
X-SD-VERN:1.0
X-SD-FORMAT_VER:2.1
X-SD-CATEGORIES:BACKUP
X-SD-CLASS:PRIVATE
X-SD-DCREATED:
X-SD-CHAR_CODE:SHIFT-JIS
X-SD-DESCRIPTION:
BEGIN:VCARD
VERSION:2.1
X-FJ-NO:
X-CLASS:PUBLIC
N;CHARSET=SHIFT_JIS:漢字氏名;;;;
SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:カナシメイ;;;;
URL:
BDAY:
ADR;HOME:;;;;;;
NOTE:
ORG:;
TITLE:
X-FJ-PI:-1
X-REDUCTION:
X-NO:
TEL;CELL:09000000000
EMAIL;CELL:aaaaa@docomo.ne.jp
X-FJ-SC:
PHOTO:
X-DCM-HMN-MODE:
X-DCM-DATALINKID:
X-DCM-ADR:
X-DCM-URL:
X-DCM-NOTE:
END:VCARD
2011-03-30 Wed 01:47 |  困っている人
> kateyさん
エラーを見てみると、「:」で始まる行がどこかにあると考えられます。

VCARD形式でそんなことがあるとは思えないのですが、その可能性を考えて、「:」で始まる行があったときはVCARDがおかしいものとみなし、その行を飛ばすようにしました。

これでエラーが出なくなると良いのですが、エラーが出るかどうか、エラーが出なかったとしたら、出力結果、Gmailへのインポート結果に問題がなさそうかをチェックしてみてください。
2011-03-30 Wed 07:33 |  did2
> 困っている人さん
コメントありがとうございます

> Name Given Name にフルネーム
> Yomi Name にフルネーム
> Given Name Yomi は 空

> VCFファイルをテキストで開いてみたら、
> JIS:の文字の後に区切り文字なくフルネームが(同じくSHIFT_JIS:フルネーム)機種によっては区切り文字があるのでしょうか。それともどこかで区切り位置の情報を持っており対応出来ますでしょうか。

おそらく私の今までの経験上では、別途区切り位置を持っていることはないと思います。また、おっしゃるとおり、機種によっては区切り文字があるそうです(Hylaさんとのコメント蘭でのやりとり参照)。
そのため、機種による区切り文字がある、もしくは自身で区切り文字(よくあるのが半角スペース)を挿入していないと、名字と名前を分離することが技術的に難しいです。

困っている人さんのVCARDでは、そのような区切り文字がなさそうですから、対応するのは難しいです。ごめんなさい。

ちなみに、私のVCARDも区切り文字がありませんでした。分離できればName Given Nameにフルネームを入れることもなかったのですが、フルネームしか利用できないため、フルネームを入れてしまっています。また、他が空だったり、フルネームじゃないはずのところにフルネームが入っているのは、そうしないとうまくGmailで表示できない場合が存在したからです(今は問題ない場合もひょっとしたら考えられます)。
2011-03-30 Wed 07:54 |  did2
すばやいお返事と対応に感動しました!
本当にありがとうございます。
名前の区切りはできてないですが、問題なく使えました。感謝します。
機種はdocomo F-01C でした。
2011-03-30 Wed 10:53 |  katey [ 編集]
> kateyさん

> 名前の区切りはできてないですが、問題なく使えました。感謝します。
ちゃんと動作したようでよかったです^^

> 機種はdocomo F-01C でした。
参考情報ありがとうございます
2011-03-30 Wed 12:11 |  did2
製作者様

さっそくのご返信ありがとう御座います。
やはり難しいですよね。ご丁寧に解説いただきありがとう御座いました。

私の携帯はF-01Aです。ここまでのレスを見る限りではdocomoは区切り文字がないのかなって感じがします。
ただdocomoの携帯自身はVCARDから電話帳を復元するときに何かを見て氏名をわける必要があるのでやはり区切り位置情報何かありそうですよね。

ツールで吐き出しだCSVを後はハンドで手直しして電話帳に取り込もうと思っています。
色々とありがとうございました。
2011-03-30 Wed 23:49 |  困っている人
> 困っている人さん

> docomoの携帯自身はVCARDから電話帳を復元するときに何かを見て氏名をわける必要があるので

なるほど。携帯では姓名分かれているのですね(自分の携帯では分かれていません)。でも不思議ですね、ぱっと見てVCARDにはそれらしき情報は見当たらないのですが^^; まさかVCARDから取り込むときは姓名を自動で分割するとか…?

> ツールで吐き出しだCSVを後はハンドで手直しして電話帳に取り込もうと思っています。

もし手動で姓名を分けるのなら、CSVを加工するより、Hylaさんとのコメントでのやりとりに出てくるVCardみたいに、半角セミコロンで姓名を区切ってからスクリプトを使ってCSVを作る方が簡単にできると思います。セミコロン区切りを判別できるようにはしてあるので。頑張ってください><

2011-03-31 Thu 08:32 |  did2
以前のバージョンでは問題なくフリガナが入力されていたのですが、今回のものはフリガナが生成れたCSVファイルに無いです。
どうすればフリガナを付けることができるでしょうか?
2011-04-09 Sat 07:12 |  ayase
> ayaseさん
コメントありがとうございます

手元の環境とvCardファイルだと、ふりがながちゃんと出力されるので、どんなvCardファイルだとうまくいかないかをチェックするために、vCardファイルの中身を他のコメントのように貼り付けてもらえますか?

もしくは、
「 Dim SplitFamilyAndGiven : SplitFamilyAndGiven = True」
という行を
「 Dim SplitFamilyAndGiven : SplitFamilyAndGiven = False」
に書き換えると、今までと同じように動作するはずなので、これでうまくいくかもしれません。
試してみてください。
2011-04-09 Sat 11:40 |  did2
素早い回答ありがとうございます。
以下の形式となっております。
それと、提示していただいた方法も試してみたのですが、ダメみたいでした。

BEGIN:VCARD
VERSION:3.0
FN:
N: ;;;;
SORT-STRING:
TEL;TYPE=PREF,CELL:
EMAIL;TYPE=PREF,CELL:
X-GNO:
X-GN:
X-REDUCTION:
CLASS:PUBLIC
REV:
END:VCARD
2011-04-09 Sat 13:54 |  ayase
>ayaseさん

> BEGIN:VCARD
> VERSION:3.0
> FN:
> N: ;;;;
> SORT-STRING:
> TEL;TYPE=PREF,CELL:
> EMAIL;TYPE=PREF,CELL:
> X-GNO:
> X-GN:
> X-REDUCTION:
> CLASS:PUBLIC
> REV:
> END:VCARD

ふりがな(SOUND)がないようなのですが、FNやNに含まれていたりしますか?
データの中身を適当な名前に変えてでOKなので、内容を埋めた形で貼り付けていただけると助かります。
2011-04-09 Sat 14:12 |  did2
このような感じです。

BEGIN:VCARD
VERSION:3.0
FN:山田太郎
N:山田太郎;;;;
SORT-STRING:ヤマダダロウ
TEL;TYPE=PREF,CELL:09000000000
EMAIL;TYPE=PREF,CELL:0123@ezweb.ne.jp
X-GNO:3
X-GN:group1
X-REDUCTION:3
CLASS:PUBLIC
REV:20100904T024131Z
END:VCARD
2011-04-09 Sat 15:09 |  ayase
>ayaseさん

やはりふりがな情報が見当たりません。
ふりがな情報がない以上、ふりがなを出力することは出来ないのですが、この前に成功したときと、何か状況が違いませんか?

2011-04-09 Sat 15:27 |  did2
フリガナは
SORT-STRING:ヤマダダロウ
のところに記載されています。
この前成功した時とはなにも変わっていないはずなのですが。
2011-04-09 Sat 15:41 |  ayase
> ayaseさん

あ、すいません、SORT-STRINGが半角カタカナで、手元の環境で???と表示されていて気がつきませんでした。
SORT-STRINGでもふりがなとして認識するようにしてみました。試してみてください。

2011-04-09 Sat 16:01 |  did2
実行したところ
行:171
文字:7
エラー:インデックスが有効範囲にありません。
とでてしまいます。
2011-04-09 Sat 16:20 |  ayase
> ayaseさん

またちょっと修正してみました。これでどうでしょう。
2011-04-09 Sat 16:36 |  did2
ありがとうございます。
無事フリガナの件は解決しました。

ですが、Phone 1 - Valueの欄が指数表示になってしまい、はじめの桁の0がなくなってしまいます。
090******** → 90********
2011-04-09 Sat 16:44 |  ayase
>ayaseさん

> ありがとうございます。
> 無事フリガナの件は解決しました。
直ったみたいで良かったです。

> ですが、Phone 1 - Valueの欄が指数表示になってしまい、はじめの桁の0がなくなってしまいます。
> 090******** → 90********
もしかして、Excelで開いていますか?Excelで普通に開くと、数字として扱われてしまい、そう見えるのですが、中身は問題がない可能性があります。それとも、テキストエディタで開いてもそうなりますか?
2011-04-09 Sat 16:48 |  did2
失礼しました、エクセルで開いていたためそうなっていたようです。
本当にありがとうございました。
これでやっとアドレス帳が移行できそうです。
2011-04-09 Sat 16:55 |  ayase
> ayaseさん

> これでやっとアドレス帳が移行できそうです。
スマートフォン楽しんでください♪
2011-04-09 Sat 19:53 |  did2
たびたび申し訳ありません。
auの形式からdocomoの形式にしたかったのですが、どこをいじって良いのかよくわからなかったです。
現在の状況はNameとGiven Name
とFamily Name同じ名前が重複して入っている感じです。
また、フリガナもYomi Name
とFamily Name Yomi
に重複して入っています。

そしてE-mail 2 - Type
に通常使用のEメールアドレスが入ってしまっていて、これらをExcelで一括で処理しようと思ったのですが、例のごとくエクセルで処理してしまうと電話番号の頭が消えてしまいます。

テキストエディタで列ごとに一括で処理する方法はあるのでしょうか?
2011-04-09 Sat 20:53 |  ayase
>ayaseさん

auのvCardからgoogleのCSVを経由してdocomoのvCardにしたいということですか?

> 現在の状況はNameとGiven Name
> とFamily Name同じ名前が重複して入っている感じです。
> また、フリガナもYomi Name
> とFamily Name Yomi
> に重複して入っています。

重複には理由があります。一般的に、姓名が分離できない場合は重複させたほうが良いという判断です。重複しているデータを元にして、新しく自分で列を作り直すといいと思います(Excelなどで)。

> そしてE-mail 2 - Type
> に通常使用のEメールアドレスが入ってしまっていて、これらをExcelで一括で処理しようと思ったのですが、例のごとくエクセルで処理してしまうと電話番号の頭が消えてしまいます。

電話番号の頭が消えるのは、csvを直接Excelで開いたからであって、データのインポートからCSVを読み込んで、読み込むときの設定でその列を文字列として読み込むように手動で指定すればExcelのシートに先頭の0が消えることなく取り込むことが出来ます(参考:http://www.eurus.dti.ne.jp/~yoneyama/Excel/mous_jyo/jyo-1.html)

> テキストエディタで列ごとに一括で処理する方法はあるのでしょうか?

無いとは言いきれませんが、テキストエディタの仕事ではないと思います。プログラムを書くべき複雑さだと思います。
2011-04-09 Sat 23:55 |  did2
色々とありがとうございました。
頑張ってみます。
2011-04-10 Sun 08:33 |  ayase
情報科学屋さんを目指す人 さま
ようやく、わたしのほしいプログラムにたどり着きました。
こういうプログラムを公開していただいているなんて、たいへんありがたいことです。
このページを、価格.comのIS04のクチコミで紹介したいのですが、よろしいでしょうか?

それと、当方、auのW52Sから、出したファイルが、N項目に、ことごとく、セミコロンがないようで、150行 インデックスが有効範囲にありませんエラーが出ます。
プログラム内容見ましたが、150行あたり、Instr文追加、変更してみました。

vcf ファイル
BEGIN:VCARD
VERSION:3.0
FN:幼稚園
N:幼稚園
SORT-STRING:ヨウチエン
TEL;TYPE=PREF,HOME:0600000000
ADR:;000-0000住所;;;;;
X-REDUCTION:0
X-GN:学校
X-GNO:8
CLASS:PUBLIC
REV:20050410T024149Z
END:VCARD

プログラム変更
case "N" のところ
if InStr(1,AC,";")> 0 Then
SSName = Split(AC, ";") ' SemicolonSplitedName
If(Len(SSName(0)) > 0 AND Len(SSName(1)) > 0) Then
strName = SSName(0) & SSName(1)
strFamilyName = SSName(0)
strGivenName = SSName(1)
Else
strName = Replace(AC, ";", "")
strFamilyName = Replace(AC, ";", "")
strGivenName = Replace(AC, ";", "")
End If
Else
strName = Replace(AC, ";", "")
strFamilyName = Replace(AC, ";", "")
strGivenName = Replace(AC, ";", "")
End If

と、やっつけで変更して、実行してみました。
最終、googleインポートまでは、やってませんが、CSVファイルは出力できました。

あと、いろいろ、カスタマイズしていこうと思っています。
2011-05-21 Sat 22:42 |  My_Pa [ 編集]
> My_Paさん
コメントありがとうございます

> このページを、価格.comのIS04のクチコミで紹介したいのですが、よろしいでしょうか?
はい、大丈夫です。紹介お願いします。

> それと、当方、auのW52Sから、出したファイルが、N項目に、ことごとく、
> セミコロンがないようで、150行 インデックスが有効範囲にありませんエラーが出ます。
vCard仕様書を一切読まずにコードを書いているので、セミコロンが無い場合が今まで一度もなく、その場合を考慮していませんでした。

> プログラム内容見ましたが、150行あたり、Instr文追加、変更してみました。
> 最終、googleインポートまでは、やってませんが、CSVファイルは出力できました。
対策ありがとうございます。
今はあまり時間がとれないのですが、反映しようかと思います。

> あと、いろいろ、カスタマイズしていこうと思っています。
なんとなく周りのコードを見ながら書けばカスタマイズはやりやすいほうだとは思うのですが、
何か分からないところがあれば質問してください(だいぶ記憶が抜けている部分もありそうですが)
2011-05-22 Sun 09:18 |  did2
did2 様
早速のご返答、ありがとうございます。
ソースを表示していただいているので、勉強しながら、改良していきたいと思います。
現状、googleのアドレス管理ですが、着信音の設定が、私の調べた限り、バックアップされていないので、そのあたりを、対応できないか、考えています。
また、よろしくおねがいします。
2011-05-22 Sun 14:08 |  My_Pa [ 編集]
情報科学屋さんを目指す人 さま
docomo N904i→au htc EVO ISW11HTの電話帳変換に無事成功しました。
大変ありがとうございました。
2011-05-23 Mon 13:06 |  ぶれっど [ 編集]
> ぶれっど さん
コメントありがとうございます

> docomo N904i→au htc EVO ISW11HTの電話帳変換に無事成功しました。

動作報告ありがとうございます。
コードを書いてからだいぶ経ちますが、まだちゃんと動くようで安心しています^^
2011-05-24 Tue 12:38 |  did2
はじめまして。auのIS03ユーザーです。
IS03のアドレス帳データをGmailにインポートしたく、色々検索をしてやっと出会えました!ありがとうございます!
そこで、一つ、教えてください。

無事にcsvファイルに変換しインポートできたのですが、アドレスや電話番号などは反映されてますが、全件名前が反映されません。
元のcsvファイルを開いてみましたが、「Name」欄は全てブランクになっています。
お手隙の時で構いませんので、教えてください!!宜しくお願いします。

2011-05-24 Tue 17:33 |  mica
> mica さん
コメントありがとうございます。

> 無事にcsvファイルに変換しインポートできたのですが、アドレスや電話番号などは反映されてますが、全件名前が反映されません。
> 元のcsvファイルを開いてみましたが、「Name」欄は全てブランクになっています。
> お手隙の時で構いませんので、教えてください!!宜しくお願いします。
どうしてそうなってしまうのか検証したいので、過去のコメントにあるような感じで、そのvCardファイルの中身の一部(一人分)を貼り付けることは可能でしょうか(もちろん名前などの個人情報はうまく伏せてください)。よろしくおねがいします。
2011-05-24 Tue 19:20 |  did2
ご返信ありがとうございます。
すみません。一件抜粋してお送りしたいのですが、、、vCardファイルを開くとOutlookの連絡先になります。どのように抜粋してお送りすればいいのでしょうか。本当に色々と無知でごめんなさい。
2011-05-25 Wed 18:57 |  mica
> micaさん

> すみません。一件抜粋してお送りしたいのですが、、、vCardファイルを開くとOutlookの連絡先になります。どのように抜粋してお送りすればいいのでしょうか。本当に色々と無知でごめんなさい。

メモ帳は起動できますか?メモ帳を起動して、そのメモ帳に.vcfファイルをドラッグアンドドロップすれば、.vcfファイルをメモ帳で簡単に開けます。うまくいきますでしょうか。
2011-05-25 Wed 21:51 |  did2
返信が遅くなりすみません!
メモ帳で開いたところ英語がツラツラと羅列されています。そのデータを添付してもよろしいですか?
どこが一件とかも不明なので・・・・。
2011-05-27 Fri 20:31 |  mica
> mica さん
データを匿名にしないで貼り付けたり、メールに添付したりするのは最終手段(良くないこと)なので、もうちょっと粘りたいです^^;

> メモ帳で開いたところ英語がツラツラと羅列されています。

これは、一切日本語が無い感じですか?もしそうなら文字化けの可能性が考えられ、もし、少しでも日本語があれば、一人分はBEGIN:VCARDからEND:VCARDまでが一人分なので、「BEGIN:VCARD」と「END:VCARD」を見つけて(検索したりして)、そこを匿名にして貼り付けてもらえればいいのですが。

とりあえず、スクリプトの該当箇所に欠陥がないか今ちょっと見てみますね。
2011-05-27 Fri 22:06 |  did2
My_Pa さんから報告があった、「N」の行にセミコロンが一つもない場合に対応しました。

また、mica さんの問題の可能性を推察したところ、「N」の行が存在しないか、「N」の中身そのものが空である可能性が大きいということになりました。この場合でも、どこかに名前の情報があるはずで、その第一候補は「FN」です。従来、「FN」は有ったり無かったりする一方で、「N」は必ず存在していたため、「N」のみを処理し、「FN」は処理していませんでした。そこで、「FN」しかない場合を考慮して、「N」が存在しない場合に限り、「FN」の行を処理するようにスクリプトを修正しました。

もしかすると、これでmicaさんの問題が解決された、かもしれません(全然どうなるか分かりませんが、可能性の一つを潰しました)。
2011-05-28 Sat 12:09 |  did2
did2 さま

早速の対応、ありがとうございます。
実際に、gmailに反映させてみると、少々ほかの問題点が...

1.TELと、EMAILについて
 私の、vCardでは、(以前のayase さん のも、そのようですが)
 どちらも、TYPE=PREF,INTERNET と、いうように、優先番号/メールの装飾があり、[PREF,]を飛ばさないとだめなようです。

2.FN がない場合の対応で
 "Given Name" と、"Family Name" 両方に、フルネームを入れてしまっているので、googleで 「苗字名前苗字名前」になってしまっています。

3.同じく、N のところで
 最初に、strFamilyName と strGivenName  に フルネームをセットしているため、姓名分離できなかったとき、「苗字名前苗字名前」になってしまいます。


1 については、EMAIL の判定で、"=" と同じように、","の判定を追加してみました。
2,3については、"Given Name"への代入をコメントにしてみました。


一応、これで、gmailインポートできました。
2011-05-29 Sun 15:40 |  My_Pa
情報科学屋さんを目指す人 さま
色々とご親切にありがとうございます。
メモ帳で開き、おそらくこれが1件だと思うところをコピペします。電話番号を見て個人ではなく企業をコピペしましたので大丈夫だと思います。
因みに、この連絡先の登録している名前は「コナミスポーツ恵比寿」です。
ご検証宜しくお願い致します!

BEGIN:VCARD
VERSION:3.0
FN;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=83R=83i=83~=83X=83|=81[=83=
c=8Cb=94=E4=8E=F5
N;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=83R=83i=83~=83X=83|=81[=83c=
=8Cb=94=E4=8E=F5;;;;
REV;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:20110510T011809Z
SORT-STRING;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=BA=C5=D0=BD=CE=DF=
=B0=C2=B4=CB=DE=BD
SOUND;X-IRMC-N;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=BA=C5=D0=BD=CE=
=DF=B0=C2=B4=CB=DE=BD;;;;
TEL;TYPE=VOICE;CHARSET=SHIFT_JIS:0354691441
END:VCARD
2011-05-30 Mon 14:19 |  mica
> My_Pa さん

> 1.TELと、EMAILについて
>  私の、vCardでは、(以前のayase さん のも、そのようですが)
>  どちらも、TYPE=PREF,INTERNET と、いうように、優先番号/メールの装飾があり、[PREF,]を飛ばさないとだめなようです。

こういう場合があることには気がついていませんでした。PREFなんてものがあるんですね。

> 2.FN がない場合の対応で
>  "Given Name" と、"Family Name" 両方に、フルネームを入れてしまっているので、googleで 「苗字名前苗字名前」になってしまっています。
> 3.同じく、N のところで
>  最初に、strFamilyName と strGivenName  に フルネームをセットしているため、姓名分離できなかったとき、「苗字名前苗字名前」になってしまいます。

これは、Given NameとFamily Nameのどちらかしか読み込んでくれないAndroidのクライアントがあったとかどうとかという話がなにかしらあって、わざとやっていることです(細かい理由は思い出せません)。

ただし、Gmail上の連絡先の表示では、Given NameとFamily Nameが同じ場合は「苗字名前苗字名前」とはならず、ちゃんと「苗字名前」になるはずで、実害はないと思うのですが…(詳細表示すると、それぞれにフルネームがもちろん入っていますが、表示だけはちゃんとなります。こういう場合をはじめから考慮しているのでしょう)

1番目については対策しようかと思います。
2,3番目については、よく分からない部分があるので、とりあえず保留しようと思います。変更は簡単ですし。

> 一応、これで、gmailインポートできました。

おめでとうございます! 無事インポートできたことが何よりです。
不便に思っているけど、よくわからないから我慢、という人はたくさん居ると思うので、そういう人にもっとこのスクリプトを利用してもらいたいです。
2011-05-30 Mon 23:51 |  did2
> mica さん

> メモ帳で開き、おそらくこれが1件だと思うところをコピペします。

はい、ずばりこれが一件分です。
これでうまく出来ない理由が分かりました。

「=83R=...」みたいな「=」がたくさんある部分は、もともとあった「名前」や「ふりがな」などが、Quoted Printableという形式で変換されてしまった結果で、この変換が失敗の原因です。
CSVにするためには、変換された「=」がたくさんあるやつを解読して元に戻してあげる必要があるのです。

このQuoted Printableがらみの問題は以前にもコメントで指摘されていて、そのときは、Quoted Printableで変換している行を無視するように修正しました。

今回、micaさんの.vcfファイルの場合は、肝心の「名前」がQuoted Printableで変換されており、「名前」を無視してしまっていたわけです。

以前コメントで指摘されたときは「メモ」がQuoted Printableで変換されていたため、無視してしまっても致命傷にはならなかったのですが、今回はそういうわけにも行かなさそうです。

そうなると、Quoted Printableの逆変換(デコード)を行う必要がありそうです。
これはちょっと数分で出来る作業ではないので、また少ししたらコメントに進捗を書こうかと思いますので、それまでお待ちいただければ幸いです。
2011-05-31 Tue 00:12 |  did2
情報科学屋さんを目指す人 さま

ほんと無知なのにご親切にありがとうございます!
コメント読ませて頂きましたが、なんだか難しそうですね・・・。
まだお手数お掛けしちゃいますが宜しくお願いします。
2011-05-31 Tue 09:56 |  mica
did2 さま
苗字名前重複の件、gmailのインポートの挙動が良くわからなくなってきました。
先日、実験していたときは、見事に、「苗字名前苗字名前」が、一覧に表示されていたのですが、先ほど、"Given Name" と、"Family Name" 両方に、フルネームが入っているファイルを、再インポートしましたが、まともに表示されているし、詳細表示しても、問題ないし、で、私が以前指摘していた問題は、再現できずなので、ここのスクリプトは、現状で、OKです。お手数かけてます。
今となっては、何を見ていたのか疑問が残ります。
2011-06-02 Thu 10:58 |  My_Pa [ 編集]
did2さま

はじめまして。

AUのW61SのVcardを変換したいと思い、こちらにたどり着きました。
早速スクリプトを使わせていただいたのですが、以下のエラーが返ってきました。


行: 247
文字: 20
エラー: インデックスが有効範囲にありません。:'Split(...)'
コード: 800A0009
ソース: Microsoft VBScript 実行時エラー

ちなみにエクセルでVCFファイルを開いたところ、4038行ありました。


大変恐縮ですが、エラーの原因についてご指南いただけないでしょうか。
よろしくお願いいたします。_(._.)_
2011-06-09 Thu 08:54 |  onibiz [ 編集]
> onibiz さん
コメントありがとうございます

おそらく、住所の形式がおかしいのですが、VCFファイルの中にある「ADR」で始まる行を抜き出して貼り付けてもらえませんか。

もしくは、他のコメントに書かれているように、一人分のVCF(BEGIN:VCARDからEND:VCARDまで)でもいいです。

それがないと、原因が分からないので、おねがいします。
2011-06-09 Thu 23:30 |  did2
did2さま
レスありがとうございます!
以下、一件分のVCFです。

BEGIN:VCARD
VERSION:3.0
FN:赤レンガ事務局
N:赤レンガ事務局;;;;
SORT-STRING:アカレンガジムキョク
TEL;TYPE=PREF,VOICE:0452111515
X-GNO:0
X-REDUCTION:0
CLASS:PUBLIC
REV:20080816T125301Z
END:VCARD


↑にはADRがないので、ADRのある行を一行下記に抜き出します。

ADR;TYPE=POSTAL:;東京都文京区千駄木2-3-20 花菱ハイツA1;;;;;


お手数かけます。よろしくお願いいたします。
2011-06-10 Fri 16:38 |  onibiz [ 編集]
以前修正されたとのことでしたが、まだ「Over 100 Lines in a single vCard 」でます。

手直しして使った為、私は問題なかったのですが念のためご報告です。
(ちなみに1000に直してもエラー出たので10000にしたらうまくいきました)
2011-06-22 Wed 23:19 |  tomomi
ありがとうございます!
このツールでグループの復元ができて大変助かりました。

auのW61Sから、このツールでアドレス帳の移行をしたところエラーが出たため、少し手直しをさせていただいたところうまく取り込むことができました。
手直しした点をご報告させていただきます。

1. 携帯側で「画像ファイルを含めてエクスポート」すると、「PHOTO;ENCODING=B;TYPE=GIF:」というヘッダで画像ファイルが出力されるため、1つのvCardデータが100行を越えてしまいますので、If nVCardLines > 100 Then~を9999に変更しました。
2. 行が半角スペースで始まる行は前行の続きとなるため、Sub ReadLineで前の行に結合するようにしました。
3. 住所が「"ADR;TYPE=POSTAL"」というヘッダとなっていたため、「Case "ADR", "ADR;TYPE=POSTAL"」に変更しました。
4. 血液型がインポートされないため、「X-BLOODTYPE」をカスタムフィールド("Custom Field 1 - Type"/"Custom Field 1 - Value")として取り込むようにしました。
2011-06-25 Sat 17:59 |  ばぐ★NAGA [ 編集]
auのreという機種ですが、一行が90文字で折り畳まれておりました。

ADR;TYPE=POSTAL:;やたら長い住
所;;;;;

最初の行の解析時にエラーになります。
このようなvcfを吐く機種がどれだけあるか分かりませんが、対応しておいた方が良いのではないでしょうか?
http://tools.ietf.org/html/rfc2425
(5.8.1. Line delimiting and folding)
http://tools.ietf.org/html/rfc822
(3.1.1. LONG HEADER FIELDS)

海外住所はカンマ入ったりするので、\,か""でゴニョゴニョする場合の改造指南コメントなんか入っていると更に強力かも。

文句タラタラっぽいですが誤解しないで下さい、神アプリですコレ。
JavaScript使ったりすれば、AndroidのブラウザでSD内vcf→本体内の電話帳、みたいな事もできたりするんでしょうか? >anyone
2011-07-01 Fri 20:31 |  finger5
> onibizさん
ADRの行を見る限り、その行は問題なさそうですが、どこか別の行にあるADRに問題がありそうです。
なぜかセミコロンが入っていないADR行があるのではないか、ということが予想されます。

なので、セミコロンが足りない場合の対策を記述してみました。
これでうまくいくか試してみてください。
2011-07-15 Fri 14:26 |  did2
> tomomiさん
コメントありがとうございます。

今確認してみたところ、制限が100行に戻ってしまっていたので、1万行に設定しました。報告ありがとうございます。
2011-07-15 Fri 14:33 |  did2
>ばぐ★NAGAさん
コメントありがとうございます

> 手直しした点をご報告させていただきます。
丁寧にありがとうございます。

> 1. 携帯側で「画像ファイルを含めてエクスポート」すると、「PHOTO;ENCODING=B;TYPE=GIF:」というヘッダで画像ファイルが出力されるため、1つのvCardデータが100行を越えてしまいますので、If nVCardLines > 100 Then~を9999に変更しました。

前のコメントにも書いたのですが、手違いで数字が小さい(100)ままになっていたので、修正しました。


> 2. 行が半角スペースで始まる行は前行の続きとなるため、Sub ReadLineで前の行に結合するようにしました。

これに関しても、連結するように変更してみました。


> 3. 住所が「"ADR;TYPE=POSTAL"」というヘッダとなっていたため、「Case "ADR", "ADR;TYPE=POSTAL"」に変更しました。

Select-Case文でチェックするときは、ヘッダのセミコロンより前しか見ていません。なので、「;TYPE=POSTAL」の部分は判定に利用されず、「ADR」も「ADR;TYPE=POSTAL」も、どちらも「ADR」として扱われています。変更しても問題ありませんが、今回は変更しませんでした。


> 4. 血液型がインポートされないため、「X-BLOODTYPE」をカスタムフィールド("Custom Field 1 - Type"/"Custom Field 1 - Value")として取り込むようにしました。

拡張的なデータを取り込みたい場合の参考になります。ありがとうございました!
2011-07-15 Fri 17:29 |  did2
> finger5さん
コメントありがとうございます

> auのreという機種ですが、一行が90文字で折り畳まれておりました。
>
> ADR;TYPE=POSTAL:;やたら長い住
> 所;;;;;
>
> 最初の行の解析時にエラーになります。

前のコメントでも指摘があったので、半角スペースで始まる行を、その手前の行に連結するように変更してみました。


> 海外住所はカンマ入ったりするので、\,か""でゴニョゴニョする場合の改造指南コメントなんか入っていると更に強力かも。

「"」については対応していたのですが「,」についても対応してみました。
CSV中の要素に「"」または「,」が含まれている場合は、その要素ごと「"」と「"」で挟み、含まれていた「"」を「""」にします。

> 文句タラタラっぽいですが誤解しないで下さい、神アプリですコレ。
ありがとうございます><

2011-07-15 Fri 17:55 |  did2
管理者様

お世話になっております。
素晴らしい内容が書いてあり、参考に実行をしてみましたが、エラーが発生しました。


行:294
文字:3
エラー:インデックスが有効範囲にありません。:「nRow」
コード:800A0009
ソース:Microsoft VBScript 実行時エラー

VCFデータをワードで開き294を検索してみたところある友人のアドレスが294に該当するものでした。

下記に個人情報をカットして掲載させていただ貴ます。お忙しい中恐縮ですが、お手すきの際に解決方法をご教授願えないでしょうか。

よろしくお願いいたします。


BEGIN:VCARD
VERSION:2.1
X-FJ-NO:294
X-GNO:14
X-GN;CHARSET=SHIFT_JIS: ƒXƒyƒbƒN
X-CLASS:PUBLIC
N;CHARSET=SHIFT_JIS:t”ö‚­‚ñƒXƒyƒbƒN;;;;
SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:ÊÙµ¸Ý½Í߯¸;;;;
URL:
BDAY:
ADR;HOME:;;;;;;
NOTE:
ORG:;
TITLE:
X-FJ-PI:-1
X-REDUCTION:
X-NO:294
TEL;VOICE:個人情報
TEL:
TEL:
TEL:
TEL:
EMAIL;INTERNET:個人情報
EMAIL;CELL:
EMAIL;CELL:
EMAIL;CELL:
EMAIL;CELL:
PHOTO:
X-DCM-HMN-MODE:
X-DCM-DATALINKID:
X-DCM-ADR:
X-DCM-URL:
X-DCM-NOTE:
END:VCARD

2011-07-26 Tue 00:40 |  うっちー
> うっちーさん
コメントありがとうございます

> VCFデータをワードで開き294を検索してみたところある友人のアドレスが294に該当するものでした。
実は、エラーメッセージの「294行」というのは、私が表示しているメッセージではなく、このスクリプトを実行しているプログラムが表示していて、VCFの行数ではなく、スクリプトの行数を指し示しています。すいません、紛らわしいですよね^^;

さて、このエラーなのですが、今現在の294行目は
「CSVRows(nRow) = Row」
です。

このエラーから考えられるのは、アドレス帳の件数が999件より多いのではないかと言うことです。
1000件以上でこのエラーが出るようになっていました。
なので、この999件という上限を、ためしに1万件にしてみたいと思います。

これで直るかどうか分かりませんが、一度試してみてください。
2011-07-26 Tue 01:56 |  did2
管理者様

お世話になっております。
昨日質問させていたたいたものです。
早速の回答ありがとうございます。

実行してみたところ
うまく行きました!!
ありがとうございました。

このサイトと紹介されている素晴らしい内容が
広く世に広まるように願っております。



2011-07-26 Tue 18:01 |  うっちー
> うっちーさん

> 実行してみたところ
> うまく行きました!!
> ありがとうございました。

予想が当たったみたいで良かったです!

> このサイトと紹介されている素晴らしい内容が
> 広く世に広まるように願っております。

そんなたいした物じゃないのですが、グループをあきらめたり、手動で設定する人が多少なりとも減ればよいかな、と思っています。近くにスマートフォンデビューする人がいたら、是非教えてあげてください。
2011-07-26 Tue 21:47 |  did2
管理者様
スマホ、gmail、PCの電話帳の中途半端な同期を整理したくて彷徨っていましたら、こちらに辿り着きました。
なんとか、csvになりました!感動です!

①コピーがうまくできなかったため、全文コピ→三桁の行番号をこつこつ削除
②電話番号の頭の'0'がcsvで見えなくなってしまったことの解決
これにドがつく素人の私は時間を要しました。
2011-07-31 Sun 13:14 |  さわこ
> さわこさん
コメントありがとうございます

> なんとか、csvになりました!感動です!
なんとかなったようでよかったです^^

> ①コピーがうまくできなかったため、全文コピ→三桁の行番号をこつこつ削除
うまくコピーボタンが見つけられれば簡単なはずなのですが、うまくいかないときはそうなってしまいますね。

> ②電話番号の頭の'0'がcsvで見えなくなってしまったことの解決
Excelで開くと、そのように見えるだけで、とくに何かする必要はありません。(前のコメントにも書いてあります)
2011-08-02 Tue 18:54 |  did2
管理者様

SH906iでバックアップした連絡先をエラーなくGMailにインポートすることができました。

グループ分けが反映されていてとても助かりました。

ありがとうございます。
2011-09-06 Tue 10:38 |  ryosuke [ 編集]
> ryosukeさん
コメントありがとうございます。

> SH906iでバックアップした連絡先をエラーなくGMailにインポートすることができました。
> グループ分けが反映されていてとても助かりました。
スマートフォンデビュー(かな?)おめでとうございます!
2011-09-12 Mon 17:08 |  did2
すごい役立ちました!天才ありがとう♪
2011-09-27 Tue 00:13 | 
> すごい役立ちました!

ありがとうございます!!
2011-09-27 Tue 01:10 |  did2
どうも!IS12T利用者でdocomoからMNPしました。電話番号がちゃんと反映されなくて困っていましたが、このツールで助かりました!!!
本当にありがとう!!!!
2011-09-27 Tue 16:54 |  通りすがり
> どうも!IS12T利用者でdocomoからMNPしました。電話番号がちゃんと反映されなくて困っていましたが、このツールで助かりました!!!
> 本当にありがとう!!!!

電話番号がちゃんと反映されない問題があることは知りませんでした。
コメント&動作報告ありがとございました!
2011-09-27 Tue 17:20 |  did2
9/27にコメントさせて頂いたものです。
ガラケーだと電話番号の設定を携帯とか自宅とかマークで設定出来るのですが、
それが「その他」になっていると、
そのまま突っ込むとダメなんです。

でもこのサイトの方法だと大丈夫でした!
2011-10-05 Wed 18:03 |  通りすがり
> ガラケーだと電話番号の設定を携帯とか自宅とかマークで設定出来るのですが、
> それが「その他」になっていると、
> そのまま突っ込むとダメなんです。
> でもこのサイトの方法だと大丈夫でした!

どういうわけか、その分類が原因でインポートできないことがあるみたいですね。
うまくいったようで良かったです。
コメントありがとうございました!

2011-10-06 Thu 14:58 |  did2
すばらしい!
auでガラケー→iPhoneに乗り換えた際に、説明員さんの手違いがあって、アドレス帳が移行できなく困っていましたが、助かりました。

2011-10-16 Sun 13:41 | 
> auでガラケー→iPhoneに乗り換えた際に、説明員さんの手違いがあって、アドレス帳が移行できなく困っていましたが、助かりました。

そんなこともあるんですね。お疲れ様です!

auのガラケーから移行したデータもiPhoneでうまく表示できるということがわかりました。
コメントありがとうございました!
2011-10-21 Fri 17:05 |  did2
グループ分けやメモ内容・誕生日まで、ほとんどの情報を損なうことが無い、こちらのような物を探していました。公開ありがとうございます^^

元データはauのBaskey(H001)上でSDに保存したvcfになるのですが、こちらのスプリクトをインポートした結果、Gmail上で全件が姓・名両方にフルネームが入った二重状態になりました。

当方では携帯で姓と名を半角スペース、全角スペース、「・」(中丸?)で区切っているレコードが多く、スペースだけでも上手く分けられるようになりますでしょうか?
(中丸区切りは件数も少ないので手作業出来ます。)

件数が、700近くあるもので…^^;
お手隙の時で構いませんので、良かったらお目通しお願いしますm(_ _)m

<元データ例>
BEGIN:VCARD
VERSION:3.0
FN:姓 名
N:姓 名;;;;
SORT-STRING:セイメイ
TEL;TYPE=PREF,VOICE:090XXXXXXXX
EMAIL;TYPE=PREF,CELL:x@x
X-GNO:2
X-GN:xGROUP
X-REDUCTION:3
CLASS:PUBLIC
REV:20100702T083930Z
END:VCARD

<出力CSV>
姓 名,姓 名,,姓 名,セイメイ,,,セイメイ,xGROUP,,090XXXXXXXX,,,,,"PREF,CELL",x@x,,,,,,,,,,
2011-11-08 Tue 19:41 |  fumi
こんばんは、上で相談させて頂いた者ですが、無事自己解決しました^^;

エクセルで普通に姓名の二列を別ファイルにして、読み込み直させるだけで出来ますね(汗

無事Googleには綺麗に入れることが出来ました。大変お世話になっております。
そことiOSとの連携が上手く行ってないですが、そっちも手作業で簡単に行けそうです。

ありがとうございました^^
2011-11-21 Mon 20:29 |  fumi
> fumiさん

コメントx2ありがとうございます。1つ目のコメントに返信できずじまいで申し訳ありません><

> こんばんは、上で相談させて頂いた者ですが、無事自己解決しました^^;
> エクセルで普通に姓名の二列を別ファイルにして、読み込み直させるだけで出来ますね(汗

エクセルでなんとかなったようで良かったです^^;

> 無事Googleには綺麗に入れることが出来ました。大変お世話になっております。
> そことiOSとの連携が上手く行ってないですが、そっちも手作業で簡単に行けそうです。

また何かあれば、今度は迅速に返信・対応したいと思いますので今後ともよろしくお願いいたします。

> ありがとうございました^^

こちらこそありがとうございました!
2011-11-22 Tue 19:19 |  did2
auのG9から富士通のARROWS Zへ買い換えです。
アドレス帖の移行にこれほど手間取るとは考えても見ませんでしたが、掲載のス
クリプトで大変助かりました。ありがとうございます。

私の場合、G9のvcfではグループ属性がCATEGORIESだったので、スクリプトの
該当属性X-GNを書き換えることでうまく行きました。

一部名前が多重表示されたりとかの不都合もありましたが、これはG9のアドレス
帖が姓と名を分離してないためで、ここは過去のコメントにもあるとおりあきら
めましたし、csvファイルを直接編集して対処しました。

しかし思うのですが、世界中でどれだけの人がスマホに乗り換えて同じ問題で悩
んでいるかということで、gmailなどはもっと高度なvcfトランスレータを提供
するべきじゃないんだろうかと思います。
このようなスクリプトも、PCのスキルをある程度持ってる人は理解できますが、
そうでない人にとってこの難題は悲劇のような事態だと思います。

携帯ごとに吐き出すvcfも様々な様ですが、受けはgmail一箇所なので機種ごとの
トランスレータは端末メーカーが責任もって作るべきだと感じますが、メーカー
は金にならない仕事はしないという結果がこの問題の根源かと思います。

でも、このスクリプトで救われてる人 多いんでしょうね。
よい仕事に感謝です。
2011-12-24 Sat 03:42 |  airs [ 編集]
> airsさん
コメントありがとうございます

> 私の場合、G9のvcfではグループ属性がCATEGORIESだったので、スクリプトの
> 該当属性X-GNを書き換えることでうまく行きました。

機種によってその部分もいろいろあるのですね。
時間があればCATEGORIESでも動作するようにしておきたいです。


> 一部名前が多重表示されたりとかの不都合もありましたが、これはG9のアドレス
> 帖が姓と名を分離してないためで、ここは過去のコメントにもあるとおりあきら
> めましたし、csvファイルを直接編集して対処しました。

はい、そこの部分をどうするべきかはいろいろ考え方があるとは思うのですが、
自分の環境でもっとも無難な方式でやってみたつもりです。
ただ、このことに関する意見が多いので、
ひょっとすると昔と挙動が変わっているのかもしれず、
どういう動作を標準とすべきか考え直す必要があるのかもしれないです。


> このようなスクリプトも、PCのスキルをある程度持ってる人は理解できますが、

できるだけ詳しくない人でも使えるようにVBScriptにしたつもりですが、
それでも難しめですよね。
アプリケーションにしたほうがよいのかもしれないですね。


> でも、このスクリプトで救われてる人 多いんでしょうね。
> よい仕事に感謝です。

自分自身この面倒具合があり得ないと思ったのでこのスクリプトを書きました。
なので、一人一人グループを再設定する、
なんていうあり得ない作業に挑もうとしている人に、
一人でも多く使ってもらいたいと思います。
ありがとうございました!
2011-12-26 Mon 23:41 |  did2
初めまして。素晴らしいScriptありがとうございます。
VBSでこれだけの規模書くの大変だったろうな・・・などと感動してしまいました。

さて、早速実行したところ、
VBSのコンパイル時にエラーが発生しましたので、状況とその解決策の報告をさせていただきます。
# バg・・・・ゲフンゲフン

------------------------------
[要約]
・VBSのスクリプト自身はShift-Jisで保存しないとならない
・426-427行目に余分な文字列が入っています

------------------------------
[発生したコンパイルエラー(1)]
行:424 文字:58
"終了していない文字列型の定数です。"

[エラー(1)の原因と解決策]
エディタにVimを利用していたのですが、
VBSを作成する時に何も考えずにUTF-8エンコーディングで保存してしまいました。
VBSはShift-Jisでないと動かないようなので、保存し直しで解決できました。
参考: http://d.hatena.ne.jp/replication/20091003/1254546163 様

------------------------------
[発生したコンパイルエラー(2)]
行:426 文字:15
"識別子がありません。"

[エラー(2)の原因と解決策]
426-427行目を拝見したところ、
Wscript.Argumentsオブジェクトにspanタグが埋め込まれていたので、取り除きました。

修正前の426-427行目
// =======================
ElseIf objArg.<span class="goog_qs-tidbit goog_qs-tidbit-1">Count > 1 Then
WScript.echo "対象とできるファイルは</span>1つのみです。"
// =======================



修正後の426-427行目
// =======================
ElseIf objArg.Count > 1 Then
WScript.echo "対象とできるファイルは1つのみです。"
// =======================

# これってGoogleのハイライト指定でしょうか。初見ですが綺麗に出ていますね
------------------------------
以上です。
2012-01-08 Sun 12:18 |  しそ [ 編集]
> しそ さん
長文のコメントをありがとうございます

> 初めまして。素晴らしいScriptありがとうございます。
お役に立てたようで光栄です^^
トラックバック先を拝見したところ、いろいろ大変だったようですね…
とりあえず、トラックバック先で指摘されていた1件目を読み込まないバグは修正しておきました。

> VBSを作成する時に何も考えずにUTF-8エンコーディングで保存してしまいました。
その可能性は考えたこと無かったです^^; 保存はShift-JISでお願いします。
(このコメントを読んでUTF-8やShift-JISがよく分からない場合は気にしないだけでOKのはずです)

> エラー(2)
(Twitterで連絡した通り)再現できなかったため、何も対策はしていません。

> # これってGoogleのハイライト指定でしょうか。初見ですが綺麗に出ていますね
ソースコードの表示のことでしょうか?現在ソースコードの表示にはSyntaxHighlighter2を使っています。配色は自分で設定したものです。
2012-01-09 Mon 03:14 |  did2
スクリプトの内容を更新した後は簡単なテストしか行っていないので、過去のコメントで解決している問題が再び発生していたり、vCardを出力した機種や方法によっては全然動かなかったりするかもしれません。

スクリプトがうまく動かないときは気軽にコメントしてください。
2012-01-16 Mon 16:12 |  did2
無料のアプリでデータ変換しようとしていたのですが、よくわからないエラーが出てどうしようもなく、困ってたところに、ここにたどりつきました!

詳しいことは全く分かりませんが、書いてある通りにしたら、とても簡単に変換できました!感激です!ありがとうございました!!!!!!
2012-02-06 Mon 22:06 |  ai
はじめまして。
携帯の通信料を削減すべくあれこれ検索してる際に本ブログを拝見しました。
Gmailへお手軽に電話帳の移行ができました本当にありがとうございます。
やりたい事が自分で作れる人ってすばらしいなぁと思います。
ありがとうございました★
2012-06-15 Fri 01:16 |  gatchan
はじめまして。
Quoted Printable の対応、とっても心待ちにしております。
やはり難しいでしょうか?
2012-07-22 Sun 15:34 |  shun [ 編集]
うまくインポートできた時は感動しました! Windows7で拡張子が表示されておらず、拡張子変更されていないのに気付かなかったため、スクリプト実行がされない!と一晩悩んでしまいました。気付いてからは、あっというまで本当に感謝です!!!
2012-08-05 Sun 10:35 |  MOON CHILD
まだ質問受け付けてますか?
スマホの電話帳編集がしたくて、色々探してここにたどりつきました。
vcf→csvに変換はできたのですか、グループ名が反映していません。
古い質問の中にある Quoted Printable が原因だと思うのですが・・・
その後改善策はみつかりましたか?
もし、ありましたら教えてください。
<参考>
BEGIN:VCARD
VERSION:2.1
N;CHARSET=SHIFT_JIS:姓;名;;;
FN;CHARSET=SHIFT_JIS:姓 名
SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:セイ;メイ;;;
TEL;CELL;PREF:080-1234-5678
NOTE:B
BDAY:1999-01-01
X-GN;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=89=C6=91=B0
REV:20120625T002747Z
END:VCARD

できたらでいいです。
2012-08-05 Sun 14:32 |  willcom
auのガラケーからドコモのスマホにうまくアドレス移行できました。ありがとうございます。
参考までに
ガラケー:auのPremier3
スマホ:GALAXY S3
2012-11-14 Wed 18:42 |  KIN
お世話になります。
vbsを使用させて頂いたところ、下記のエラーがはき出されました。対応して頂けるとありがたいです。宜しくお願い致します。
---------------------------
行: 141
文字: 16
エラー: インデックスが有効範囲にありません。: 'intLineNum'
コード: 800A0009
ソース: Microsoft VBScript 実行時エラー
2013-03-09 Sat 23:57 |  mt [ 編集]
このコメントは管理者の承認待ちです
2015-03-16 Mon 14:42 | 
このコメントは管理者の承認待ちです
2015-08-01 Sat 23:03 | 
このコメントは管理者の承認待ちです
2017-02-20 Mon 00:59 | 

コメントの投稿 エントリの新旧に関わらず、極力18時間中に返信します。














この記事のトラックバック

トラックバックURL:
iPhone4S買いました。 というのも前携帯が数ヶ月ほど停止した挙句、ついに解約されてしまって連絡手段がないので・・・ いやー、しかし慣れるまで大変。 iPhoneアプリを多少かじったとはいえ、自分自身が... …
2日に,11/26発売のauのAndroidケータイ,IS03がよぅやく手に入りましたょ 【送料無料】IS03 (シンプルコース一括支払い)au激安機種変更【sm15-17】【smtb... ¥63,000 楽天 なぅった写真↓ …
2010-12-04 Sat 01:10 はるのメモ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。