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)を追加
この記事のコメント
僕はP-09Aユーザーなんですが
そのvCardファイルで試したら
Can't read vCard.Line Number:22と出ました。
これはどうしたらいいんでしょうか??
コメントありがとうございます。
>Can't read vCard.Line Number:22
そのエラーメッセージは、「来るべき『BEGIN:VCARD』が予想に反して来なかった」というエラーです。
もしよろしければ、P-09Aから出力したvCardファイルの中身をコメントにコピペしていただけませんでしょうか?もちろん、名前の部分や電話番号などは「名字名前」「09012345678」など、適当に変えてもらって個人情報の見えない形にしていただいて構いません。冒頭の30行分くらいで結構ですので。
vCardファイルは適当なテキストエディタで開くことが出来ます。拡張子を.vcfから.txtにすれば、メモ帳でも開けます。
よろしくおねがいします。
こちらはこちらでちょっとコードをチェックしてみます。
このエラーの原因が、BIGIN:VCARDからEND:VCARDまでの間にある行数を20行に制限していたからである可能性が高いと考え、20行制限を100行制限へ修正しました。
> のりさん
もう一度コードをコピーして.vbsファイルを作成し直し、vCardファイルの変換作業を試みて頂けませんでしょうか。
以下のように通常とは違う形で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にインポートするのに
辟易していましたので、非常に助かりました。
スクリプトのさらなる向上を期待しています。
コメントありがとうございます。
> 上記のようなデータが出力されてしまうのは文字コード云々が問題なのでしょうが、
> 詳しいことはわかりませんでした。
サンプルデータありがとうございます。文字コード・エンコードを処理していないのが原因です。他の文字コードや、文字列がエンコードされる場合を想定していませんでした。
対応できるかすぐには分かりませんが、サンプルデータを参考にして修正してみようと思います。
> 該当データを省いたところ、正常にスクリプトを実行することができました。
> 300件近くのデータをGmail経由でXperiaにインポートするのに
> 辟易していましたので、非常に助かりました。
スクリプトが役に立ったようで嬉しいです。ありがとうございます。
> スクリプトのさらなる向上を期待しています。
はい、まずは今回の問題の修正を行いたいと思います。
gmail vcard import フリガナ でネットを探っていてこちらを見つけました。
F906iから出力したVCFで試したのですが、ダイアログに
行 107
文字 13
エラー インデックスが有効範囲にありません。:'[number:1]' コード
コード 800A0009
と出てしまいます。
何が原因でしょうか?
コメントありがとうございます
返信が大きく遅れてしまい申し訳ありません
検証後、対策について報告したいと思います
現時点で分かることとしては、
元となった.vcfファイルを見ないと本当は分からないのですが、
予想外の行がBIGIN:VCARDとEND:VCARDの間にあると推測されます。
BIGIN:VCARDとEND:VCARDの間に:(コロン)の無い行があると、
そのようなエラーが出ると思われます。
もし確認できるようでしたら、テキストエディタで.vcfファイルの中身を
報告していただけると幸いです。
とりあえず、そのような場合に、どの行の読み込み時に問題が発生したかを
確認できるコードを挿入してみようと思います
本当に連絡が遅れてしまい申し訳ありませんでした。
とりあえず今のところはF906iのVCFをそのままGmailにインポート→xperiaに同期して使ってます。
そこで気が付いたのは、グループ分けのことはもちろん、なぜか連絡先が重複しているものが何件か出てくること、Gmail側だけフリガナ順に並ばないこと、の3点です。
う~ん、なぜだ・・・
それと同期っていうのは、携帯側、PC側のどちらから編集した場合でも編集した側の内容になるっていうことなんですかね?
なんか話がずれてきてるような気もしますが、アレだったらスルーしてください(笑
> とりあえず今のところはF906iのVCFをそのままGmailにインポート→xperiaに同期して使ってます。
>
> そこで気が付いたのは、グループ分けのことはもちろん、なぜか連絡先が重複しているものが何件か出てくること、Gmail側だけフリガナ順に並ばないこと、の3点です。
>
> う~ん、なぜだ・・・
そうですね、連絡先の重複、ふりがなとグループ分けの問題は私の環境でも発生しました。
連絡先の重複はとくに気にしていないのですが、ふりがなとグループ分けの問題をとりあえず解決するためにスクリプトを作成した次第です。
> それと同期っていうのは、携帯側、PC側のどちらから編集した場合でも編集した側の内容になるっていうことなんですかね?
はい、そうなります。絶妙なタイミングで複数箇所から編集したらどうなるかとかは分かりませんが^^;
あ、早くスクリプトを編集して、おかしなところを検出できるようにしてみますね。OSを入れ直している内にいろいろありまして(←言い訳
ということで、これは寝るまでにやって反映します!
エラーの詳細が分かるように、エラーの原因と思われる部分に、エラーが起こった行を報告するコードを追加しました。もう一度試すことで、エラーの原因となっている行が特定できると思います。
コメント中の文字列が、固有名詞を含んでいる文字列を変換した物だったので、該当のコメントを削除し、伏せ字(=)を使って書き直してここに掲載しておきます。個人情報というほどではないのですがとりあえず。
以下、だんほるさんからのコメントです
> お忙しいところありがとうございます!
>
> 以下、エラーのダイアログです。
>
> ERROR:InvalidInput
> LINE_NUM:2226
> LINE:============================================================
>
> 「2226行目に、コロン(;)がありません。確認してください。」
>
> と出ました。
>
> ちなみにエクセルにコピペして2226行目を見ると、
> NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=
> 2227行目が、
> ============================================================
>
> でした。
>
> どうでしょう?
おかげさまで、とりあえずエラーが発生した原因を特定することが出来ました。Quoted-Printableという形式にスクリプトが対応していないため、Note(メモ)を読み込む際にエラーになっていたようです。とりあえず、メモくらい無くっても大丈夫に違いないという前提のもと、Quoted-Printableエンコードされている部分を無視して、エラーが発生しても強制的に続行するようにしてしまおうと思います。それで名前やらグループやらが無事に変換できていればいいのですが。
これは応急処置で、Quoted-Printableに対応できたときには、そちらでもう一度変換していただけたらなぁと思います。
> Quoted-Printableエンコードされている部分を無視して、エラーが発生しても強制的に続行するようにしてしまおうと思います。
この通りにスクリプトを変更しました。quoted-printableが原因のエラーをとりあえず無視するように変更しました。quoted-printableがどこに出てくるのか正しく把握できていないのでとにかくquoted-printableという文字が出てきた行を無視して、コロンが無い行も無視してしまっています。QUOTEDさんがもし電話帳に登録されていたら無視されるのでご注意ください^^;
QUOTEDさんは居ませんでしたので大丈夫そうです(笑
しかし・・・今試したのですが、またなんか出てきました・・・
以下ダイアログの内容です。
Over 100 Lines in a single vCard (line11908)
ちなみに、11908行目は
xLb6lb8RTHDKOx7irS1RzyVtT58/bG8NJBqumeJraLaJM29wyjq2MoT+GRXhVk0hYBxwCQT7
でした。
たびたび恐れ入ります(;^ω^)
これは、「一人分の情報が100行分もあるわけ無いだろう、
もし100行分もあったとしたら、それはどこかで間違えただけのはず、
エラーとして停止しよう」という考えに基づいたエラーです。
> xLb6lb8RTHDKOx7irS1RzyVtT58/bG8NJBqumeJraLaJM29wyjq2MoT+GRXhVk0hYBxwCQT7
これを見る限り、この行は、画像データ(をBase64エンコーディングしたもの)の一部ではないかと思います。
画像を文字にしたら100行くらい越えちゃいますよねってことです。自分は画像を使ったことがなかったのであまり考えていませんでした。電話帳に、顔写真のようなデータを関連づけている人が居ると思います。
(11908行目から上方向に進んでいくと、きっとその人の名前が見つかると思います)
残念ながら画像対応はなかなか難しいので、これまたとりあえず無視してしまおうと思います^^;
暫定的な処置として、その適当すぎる100行制限を10,000行制限にしてみます。
なんどもお手数かけますが、おかげさまで少しずついろいろ分かってきたのでスクリプトを改善できそうです。ありがとうございます。
もしよろしければ、
> xLb6lb8RTHDKOx7irS1RzyVtT58/bG8NJBqumeJraLaJM29wyjq2MoT+GRXhVk0hYBxwCQT7
この謎の文字列の行から上にたどっていただいて、この謎の行たちが始まる直前の行にどんなことが書かれているか見つけられましたら報告をお願い致します。よくわからなかったら気にしないでください。予想では、Base64という文字が含まれていたり、画像っぽい英単語が含まれている行があると思います。その行さえ分かれば、とりあえず画像データのはじまりの位置が特定できるようになりますので。
次こそうまくCSVファイルが出来ることを願っています。
CSVファイルできました!!
グループ反映されてます!!
did2さんが仰られた通り、11828行目に
PHOTO;TYPE=JPEG;ENCODING=BASE64:
11829行目から12275行目まで、写真の内容であろう英数字の羅列が並んでいました。
電話帳内で写真を関連つけているのはその一人だったのでこうなったのでしょうね。
あとはただ、フリガナ順に並んでませんでした・・・
電話帳の内容を見てみると、フリガナの欄が姓と名に分かれていてそれぞれに「ヤマダタロウ」「ヤマダタロウ」(仮名)と入っていました。
とりあえずすぐに消して元に戻したので、Xperia側は確認してません。
F906iの電話帳がそもそも姓と名に分かれた仕様だったからでしょうか。
もうそろそろほぼ放置プレイでも構いませんので、テキトーなペースでやってくださいね(;^ω^)
> グループ反映されてます!!
やった♪よかったです
> 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/ より)。
> もうそろそろほぼ放置プレイでも構いませんので、テキトーなペースでやってくださいね(;^ω^)
はい、今もうすでにてきとーなペースです(笑
行 1
文字 1
エラー 文字が正しくありません
コード 800A0408
ソース Microsoft VBScriptコンパイルエラー
作成した.vbsファイルの中身をメモ帳などのテキストエディタで開いて確認してみてください。
なにか余計な文字が最初に含まれてしまっていることが考えられます。
スクリプトの中身と見比べて、余計な文字や行が入ってしまっていませんか。
余計な文字が入らないようにするために、コードが表示されている部分にマウスを当てると右上に表示されるアイコンから「copy to clipboad」をクリックしてコピーするといいと思います。新規ファイルにそのまま貼り付けてください。
また何かあればコメントお願いします。
余計な文字が入らないように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()
メモ帳を開いてるつもりが確認せずずうとワードパッドを使ってました。
そりゃあ出来ないですよね↓↓
なので無事にできました!!この変換ソフト便利すぎます!!
これからも記事読ませていただきます♪
無事にスクリプトを実行できたようで良かったです
今後ともよろしくお願いします
こちらのスクリプトを試させていただいたところ、
インデックスが有効範囲内に有りません。
というエラーがでます。
エクセルで調べた中身は舌のようでした。
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
よろしければご教授お願いいたします。
コメントありがとうございます
エラーの文面と、vCardの中身とを検証した結果、二つの原因が推定されたので、それぞれ対応してみました。
1つめは、vCardの行末に空白がある場合についてで、読み込み時に空白を無視するようにしました。
2つめは、住所の形式についてです。
コメントしていただいた例では、住所の部分が
> ADR;HOME;CHARSET=Shift_JIS:;住所
となっています。
この形式では、コロンの後、セミコロンが1つしか有りません。
私の手元の環境と、いままでスクリプトを利用してくださった方々は、おそらく
セミコロンが5つ以上あったと思われます。
このセミコロンの数の不一致により今回の
> インデックスが有効範囲内に有りません。
というエラーが発生したと推定しました。
そこで、もしセミコロンが少ない場合であっても読み込めるようにスクリプトを変更いたしました。
このまま正しく動作するかまだ分かりませんが、もう一度試してみてください。
もし再びエラーが発生してしまった場合には、エラーメッセージの
「行」「文字」「エラー」
の3つをセットにしていただけると助かります。
今後のための補足説明:
今までのスクリプトでは、ADRの行のコロンより後ろを、「;住所;;;;郵便番号(ハイフン無し);」と仮定していました。今回はその仮定を少し弱めてあります。
正にお察しの通りでした。上手くいきました。
ありがとうございました。
> 正にお察しの通りでした。上手くいきました。
uguさん、報告ありがとうございます!
よろしければ、今後の、誰かの参考のために、何という機種の携帯電話からバックアップしたvCardファイルで問題が発生したのかをコメントしていただけないでしょうか。もちろん、まだこのコメント欄をチェックしていただけていたらの話ですが(^-^;
ありがとうございました.
コメントありがとうございます
修正して使ってもらえるとは思っていませんでした。
コードが役に立ったようで良かったです。ありがとうございます。
iPod上でも同期するのできちんと名「名前」、姓「名字」となるようにしたいのですが解決策はありますでしょうか。
よろしくお願い致します。
コメントありがとうございます
> 実行して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)
' ==============================
と書かれた部分です。(ふりがなは別途)
丁寧なご回答ありがとうございます。
私の場合、もともとsoftbankの934SHを使用しておりまして、VCFでは名字+名前が分離されてそれぞれにフリガナが入っておりました。
もともと分かれているの「名字」、「名前」にフリガナだけさえ残した形でCSVに変換できれば幸いです。
デフォルトのスクリプトで作ったCSVファイルをインポートした場合、Googleの連絡先の表示では「名字+名前」の合わさった表示のみがされていますが、右側の[…](←こんなボタン)をクリックして表示してみると、名「名字+名前」、姓「名字+名前」と二重に表示されています。
恐らくGoogle側で重複したものを表示しないようになってるんですね^^
>
> もともと分かれているの「名字」、「名前」にフリガナだけさえ残した形でCSVに変換できれば幸いです。
そうでしたか、それなら何とかなるかもしれませんね。
サンプルとして一人分のVCFファイルの中身を貼り付けてもらえますか?もちろん個人情報を隠すように内容は変更して、です。それを参考にして、対応したバージョンが作れるかやってみようかと思います。
> 恐らくGoogle側で重複したものを表示しないようになってるんですね^^
ほんとですね、名字をちょっと変えたりしたら、名字と名前が両方出現しました。よくあることなんでしょうね。
わーほんとにありがとうございます><
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
///
よろしくお願い致します。
スクリプトを変更してみました。
まず、名前とふりがながセミコロンで分離されている場合に、「姓」「名」に分けてCSVファイルを作成するように変更しました。分離されていないときは以前と同様に動作します。
また、このとき、ふりがなが半角カタカナのままだとGoogle連絡帳に取り込んだときに文字化けしてしまうことがわかったので、ふりがなについては半角カタカナをすべて全角カタカナに変換するように変更しました。
今回、GMail(Google連絡帳)への取り込みが正しく行われているかを目視で確認しましたが、実際に読み取るアプリケーション次第で、どの部分のデータを取ってくるかが異なるため、iPodならiPodで使ってみないとどうなるかは分かりません。お試しください。
(以下、その他の利用者向けの注意書き)
このスクリプトはもともとJBook2での利用を想定して作っていたので、もしかすると、JBook2ではうまく読み取れなくなってしまっている部分があるかもしれません(ちょっと手軽に検証できる環境がなく、検証できていません)。もし不具合を発見したらコメントをお願いいたします。
無事に解決しました!
ほんとにありがとうございました。
これで安心してAndroidにも移行できそうです^^
P.S.
瑣末なことですが、最初スクリプトエラーが出たのでなぜかと考えていたらブログ上のスクリプト一行目のOption Explicitが二行書かれておりました。
何も考えずにコピペだけしたらそりゃ動かないですね^^;
参考まで。
> ほんとにありがとうございました。
> これで安心してAndroidにも移行できそうです^^
うまくいったみたいでよかったです^-^
> 瑣末なことですが、最初スクリプトエラーが出たのでなぜかと考えていたらブログ上のスクリプト一行目のOption Explicitが二行書かれておりました。
ありがとうございます。コードを置き換えるときに、古いコードの1行目を消し損ねていたようです。修正しておきました。
さっそくで申し訳ないのですが少し不具合が…
上記のコメに100行制限は外れたとおっしゃっているものがありますが、まだ同種類のエラーが出てしまいます;
どうしたら解決できるのでしょうか?
コメントありがとうございます。
> 上記のコメに100行制限は外れたとおっしゃっているものがありますが、まだ同種類のエラーが出てしまいます;
表示されるエラーメッセージが同じでも、エラーの原因は別にあるかもしれません。
"同種類のエラー"とのことですが、具体的なエラーメッセージは何ですか?
原因を推測してみたいと思います。
Over 100 Lines in a single vCard (line3467)
と出ます。lineだけが違うようです…。
ご検証の結果お待ちしております。
とりあえず、一人あたりのvCardの長さの制限を100行から1万行に変更しました。
もう一度お試しください。
丁寧な対応ありがとうございますm(__)m
> 丁寧な対応ありがとうございますm(__)m
すぐに直すことが出来たようで良かったです!
ありがとうございます!
無事にVCFファイルがCSVになったのですが、G-mailの電話帳に取り込むと文字化けしてしまいます。
この対策方法はありますでしょうか?
すみませんが、アドバイス頂けませんか?
コメントありがとうございます
> 無事にVCFファイルがCSVになったのですが、G-mailの電話帳に取り込むと文字化けしてしまいます。
> この対策方法はありますでしょうか?
前回スクリプトを変更したときに、CSVファイル中に半角カタカナが入っていると、G-mailへ取り込んだときに文字化けが発生しました。どこかに半角カタカナがあるのかもしれません。前回は、ふりがなに半角カタカナが有った場合に文字化けが発生したので、ふりがなに関してのみ対策済みで、その他については今のところ未対策です。
文字化けしたのは全員ですか?それとも文字化けしなかった人も居ますか?
また、文字化けした人の中に、住所やメモ欄、名前などなど、どこかしらかに半角カタカナを含んでいるなんてことはありませんか?
どこに文字化けが含まれているのかを特定したいと思います。
もし、実際に半角カタカナが原因のようなら、該当箇所において半角カタカナを全角カタカナに変換するようにスクリプトを変更してみたいと思います。上記のチェックをよろしくお願いします。
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
コメントありがとうございます
> エラーがでてこまっています。
> 600件以上あるので、どうしても使いたいのです。
わかりました。
今日の夜、スクリプトの内容をチェックしてみます。
しかし、以下の現象が起きて困っております。
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
エラーを見てみると、「:」で始まる行がどこかにあると考えられます。
VCARD形式でそんなことがあるとは思えないのですが、その可能性を考えて、「:」で始まる行があったときはVCARDがおかしいものとみなし、その行を飛ばすようにしました。
これでエラーが出なくなると良いのですが、エラーが出るかどうか、エラーが出なかったとしたら、出力結果、Gmailへのインポート結果に問題がなさそうかをチェックしてみてください。
コメントありがとうございます
> Name Given Name にフルネーム
> Yomi Name にフルネーム
> Given Name Yomi は 空
> VCFファイルをテキストで開いてみたら、
> JIS:の文字の後に区切り文字なくフルネームが(同じくSHIFT_JIS:フルネーム)機種によっては区切り文字があるのでしょうか。それともどこかで区切り位置の情報を持っており対応出来ますでしょうか。
おそらく私の今までの経験上では、別途区切り位置を持っていることはないと思います。また、おっしゃるとおり、機種によっては区切り文字があるそうです(Hylaさんとのコメント蘭でのやりとり参照)。
そのため、機種による区切り文字がある、もしくは自身で区切り文字(よくあるのが半角スペース)を挿入していないと、名字と名前を分離することが技術的に難しいです。
困っている人さんのVCARDでは、そのような区切り文字がなさそうですから、対応するのは難しいです。ごめんなさい。
ちなみに、私のVCARDも区切り文字がありませんでした。分離できればName Given Nameにフルネームを入れることもなかったのですが、フルネームしか利用できないため、フルネームを入れてしまっています。また、他が空だったり、フルネームじゃないはずのところにフルネームが入っているのは、そうしないとうまくGmailで表示できない場合が存在したからです(今は問題ない場合もひょっとしたら考えられます)。
本当にありがとうございます。
名前の区切りはできてないですが、問題なく使えました。感謝します。
機種はdocomo F-01C でした。
> 名前の区切りはできてないですが、問題なく使えました。感謝します。
ちゃんと動作したようでよかったです^^
> 機種はdocomo F-01C でした。
参考情報ありがとうございます
さっそくのご返信ありがとう御座います。
やはり難しいですよね。ご丁寧に解説いただきありがとう御座いました。
私の携帯はF-01Aです。ここまでのレスを見る限りではdocomoは区切り文字がないのかなって感じがします。
ただdocomoの携帯自身はVCARDから電話帳を復元するときに何かを見て氏名をわける必要があるのでやはり区切り位置情報何かありそうですよね。
ツールで吐き出しだCSVを後はハンドで手直しして電話帳に取り込もうと思っています。
色々とありがとうございました。
> docomoの携帯自身はVCARDから電話帳を復元するときに何かを見て氏名をわける必要があるので
なるほど。携帯では姓名分かれているのですね(自分の携帯では分かれていません)。でも不思議ですね、ぱっと見てVCARDにはそれらしき情報は見当たらないのですが^^; まさかVCARDから取り込むときは姓名を自動で分割するとか…?
> ツールで吐き出しだCSVを後はハンドで手直しして電話帳に取り込もうと思っています。
もし手動で姓名を分けるのなら、CSVを加工するより、Hylaさんとのコメントでのやりとりに出てくるVCardみたいに、半角セミコロンで姓名を区切ってからスクリプトを使ってCSVを作る方が簡単にできると思います。セミコロン区切りを判別できるようにはしてあるので。頑張ってください><
どうすればフリガナを付けることができるでしょうか?
コメントありがとうございます
手元の環境とvCardファイルだと、ふりがながちゃんと出力されるので、どんなvCardファイルだとうまくいかないかをチェックするために、vCardファイルの中身を他のコメントのように貼り付けてもらえますか?
もしくは、
「 Dim SplitFamilyAndGiven : SplitFamilyAndGiven = True」
という行を
「 Dim SplitFamilyAndGiven : SplitFamilyAndGiven = False」
に書き換えると、今までと同じように動作するはずなので、これでうまくいくかもしれません。
試してみてください。
以下の形式となっております。
それと、提示していただいた方法も試してみたのですが、ダメみたいでした。
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
> 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なので、内容を埋めた形で貼り付けていただけると助かります。
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
やはりふりがな情報が見当たりません。
ふりがな情報がない以上、ふりがなを出力することは出来ないのですが、この前に成功したときと、何か状況が違いませんか?
SORT-STRING:ヤマダダロウ
のところに記載されています。
この前成功した時とはなにも変わっていないはずなのですが。
あ、すいません、SORT-STRINGが半角カタカナで、手元の環境で???と表示されていて気がつきませんでした。
SORT-STRINGでもふりがなとして認識するようにしてみました。試してみてください。
行:171
文字:7
エラー:インデックスが有効範囲にありません。
とでてしまいます。
またちょっと修正してみました。これでどうでしょう。
無事フリガナの件は解決しました。
ですが、Phone 1 - Valueの欄が指数表示になってしまい、はじめの桁の0がなくなってしまいます。
090******** → 90********
> ありがとうございます。
> 無事フリガナの件は解決しました。
直ったみたいで良かったです。
> ですが、Phone 1 - Valueの欄が指数表示になってしまい、はじめの桁の0がなくなってしまいます。
> 090******** → 90********
もしかして、Excelで開いていますか?Excelで普通に開くと、数字として扱われてしまい、そう見えるのですが、中身は問題がない可能性があります。それとも、テキストエディタで開いてもそうなりますか?
本当にありがとうございました。
これでやっとアドレス帳が移行できそうです。
> これでやっとアドレス帳が移行できそうです。
スマートフォン楽しんでください♪
auの形式からdocomoの形式にしたかったのですが、どこをいじって良いのかよくわからなかったです。
現在の状況はNameとGiven Name
とFamily Name同じ名前が重複して入っている感じです。
また、フリガナもYomi Name
とFamily Name Yomi
に重複して入っています。
そしてE-mail 2 - Type
に通常使用のEメールアドレスが入ってしまっていて、これらをExcelで一括で処理しようと思ったのですが、例のごとくエクセルで処理してしまうと電話番号の頭が消えてしまいます。
テキストエディタで列ごとに一括で処理する方法はあるのでしょうか?
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)
> テキストエディタで列ごとに一括で処理する方法はあるのでしょうか?
無いとは言いきれませんが、テキストエディタの仕事ではないと思います。プログラムを書くべき複雑さだと思います。
頑張ってみます。
ようやく、わたしのほしいプログラムにたどり着きました。
こういうプログラムを公開していただいているなんて、たいへんありがたいことです。
このページを、価格.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ファイルは出力できました。
あと、いろいろ、カスタマイズしていこうと思っています。
コメントありがとうございます
> このページを、価格.comのIS04のクチコミで紹介したいのですが、よろしいでしょうか?
はい、大丈夫です。紹介お願いします。
> それと、当方、auのW52Sから、出したファイルが、N項目に、ことごとく、
> セミコロンがないようで、150行 インデックスが有効範囲にありませんエラーが出ます。
vCard仕様書を一切読まずにコードを書いているので、セミコロンが無い場合が今まで一度もなく、その場合を考慮していませんでした。
> プログラム内容見ましたが、150行あたり、Instr文追加、変更してみました。
> 最終、googleインポートまでは、やってませんが、CSVファイルは出力できました。
対策ありがとうございます。
今はあまり時間がとれないのですが、反映しようかと思います。
> あと、いろいろ、カスタマイズしていこうと思っています。
なんとなく周りのコードを見ながら書けばカスタマイズはやりやすいほうだとは思うのですが、
何か分からないところがあれば質問してください(だいぶ記憶が抜けている部分もありそうですが)
早速のご返答、ありがとうございます。
ソースを表示していただいているので、勉強しながら、改良していきたいと思います。
現状、googleのアドレス管理ですが、着信音の設定が、私の調べた限り、バックアップされていないので、そのあたりを、対応できないか、考えています。
また、よろしくおねがいします。
docomo N904i→au htc EVO ISW11HTの電話帳変換に無事成功しました。
大変ありがとうございました。
コメントありがとうございます
> docomo N904i→au htc EVO ISW11HTの電話帳変換に無事成功しました。
動作報告ありがとうございます。
コードを書いてからだいぶ経ちますが、まだちゃんと動くようで安心しています^^
IS03のアドレス帳データをGmailにインポートしたく、色々検索をしてやっと出会えました!ありがとうございます!
そこで、一つ、教えてください。
無事にcsvファイルに変換しインポートできたのですが、アドレスや電話番号などは反映されてますが、全件名前が反映されません。
元のcsvファイルを開いてみましたが、「Name」欄は全てブランクになっています。
お手隙の時で構いませんので、教えてください!!宜しくお願いします。
コメントありがとうございます。
> 無事にcsvファイルに変換しインポートできたのですが、アドレスや電話番号などは反映されてますが、全件名前が反映されません。
> 元のcsvファイルを開いてみましたが、「Name」欄は全てブランクになっています。
> お手隙の時で構いませんので、教えてください!!宜しくお願いします。
どうしてそうなってしまうのか検証したいので、過去のコメントにあるような感じで、そのvCardファイルの中身の一部(一人分)を貼り付けることは可能でしょうか(もちろん名前などの個人情報はうまく伏せてください)。よろしくおねがいします。
すみません。一件抜粋してお送りしたいのですが、、、vCardファイルを開くとOutlookの連絡先になります。どのように抜粋してお送りすればいいのでしょうか。本当に色々と無知でごめんなさい。
> すみません。一件抜粋してお送りしたいのですが、、、vCardファイルを開くとOutlookの連絡先になります。どのように抜粋してお送りすればいいのでしょうか。本当に色々と無知でごめんなさい。
メモ帳は起動できますか?メモ帳を起動して、そのメモ帳に.vcfファイルをドラッグアンドドロップすれば、.vcfファイルをメモ帳で簡単に開けます。うまくいきますでしょうか。
メモ帳で開いたところ英語がツラツラと羅列されています。そのデータを添付してもよろしいですか?
どこが一件とかも不明なので・・・・。
データを匿名にしないで貼り付けたり、メールに添付したりするのは最終手段(良くないこと)なので、もうちょっと粘りたいです^^;
> メモ帳で開いたところ英語がツラツラと羅列されています。
これは、一切日本語が無い感じですか?もしそうなら文字化けの可能性が考えられ、もし、少しでも日本語があれば、一人分はBEGIN:VCARDからEND:VCARDまでが一人分なので、「BEGIN:VCARD」と「END:VCARD」を見つけて(検索したりして)、そこを匿名にして貼り付けてもらえればいいのですが。
とりあえず、スクリプトの該当箇所に欠陥がないか今ちょっと見てみますね。
また、mica さんの問題の可能性を推察したところ、「N」の行が存在しないか、「N」の中身そのものが空である可能性が大きいということになりました。この場合でも、どこかに名前の情報があるはずで、その第一候補は「FN」です。従来、「FN」は有ったり無かったりする一方で、「N」は必ず存在していたため、「N」のみを処理し、「FN」は処理していませんでした。そこで、「FN」しかない場合を考慮して、「N」が存在しない場合に限り、「FN」の行を処理するようにスクリプトを修正しました。
もしかすると、これでmicaさんの問題が解決された、かもしれません(全然どうなるか分かりませんが、可能性の一つを潰しました)。
早速の対応、ありがとうございます。
実際に、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インポートできました。
色々とご親切にありがとうございます。
メモ帳で開き、おそらくこれが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
> 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インポートできました。
おめでとうございます! 無事インポートできたことが何よりです。
不便に思っているけど、よくわからないから我慢、という人はたくさん居ると思うので、そういう人にもっとこのスクリプトを利用してもらいたいです。
> メモ帳で開き、おそらくこれが1件だと思うところをコピペします。
はい、ずばりこれが一件分です。
これでうまく出来ない理由が分かりました。
「=83R=...」みたいな「=」がたくさんある部分は、もともとあった「名前」や「ふりがな」などが、Quoted Printableという形式で変換されてしまった結果で、この変換が失敗の原因です。
CSVにするためには、変換された「=」がたくさんあるやつを解読して元に戻してあげる必要があるのです。
このQuoted Printableがらみの問題は以前にもコメントで指摘されていて、そのときは、Quoted Printableで変換している行を無視するように修正しました。
今回、micaさんの.vcfファイルの場合は、肝心の「名前」がQuoted Printableで変換されており、「名前」を無視してしまっていたわけです。
以前コメントで指摘されたときは「メモ」がQuoted Printableで変換されていたため、無視してしまっても致命傷にはならなかったのですが、今回はそういうわけにも行かなさそうです。
そうなると、Quoted Printableの逆変換(デコード)を行う必要がありそうです。
これはちょっと数分で出来る作業ではないので、また少ししたらコメントに進捗を書こうかと思いますので、それまでお待ちいただければ幸いです。
ほんと無知なのにご親切にありがとうございます!
コメント読ませて頂きましたが、なんだか難しそうですね・・・。
まだお手数お掛けしちゃいますが宜しくお願いします。
苗字名前重複の件、gmailのインポートの挙動が良くわからなくなってきました。
先日、実験していたときは、見事に、「苗字名前苗字名前」が、一覧に表示されていたのですが、先ほど、"Given Name" と、"Family Name" 両方に、フルネームが入っているファイルを、再インポートしましたが、まともに表示されているし、詳細表示しても、問題ないし、で、私が以前指摘していた問題は、再現できずなので、ここのスクリプトは、現状で、OKです。お手数かけてます。
今となっては、何を見ていたのか疑問が残ります。
はじめまして。
AUのW61SのVcardを変換したいと思い、こちらにたどり着きました。
早速スクリプトを使わせていただいたのですが、以下のエラーが返ってきました。
行: 247
文字: 20
エラー: インデックスが有効範囲にありません。:'Split(...)'
コード: 800A0009
ソース: Microsoft VBScript 実行時エラー
ちなみにエクセルでVCFファイルを開いたところ、4038行ありました。
大変恐縮ですが、エラーの原因についてご指南いただけないでしょうか。
よろしくお願いいたします。_(._.)_
コメントありがとうございます
おそらく、住所の形式がおかしいのですが、VCFファイルの中にある「ADR」で始まる行を抜き出して貼り付けてもらえませんか。
もしくは、他のコメントに書かれているように、一人分のVCF(BEGIN:VCARDからEND:VCARDまで)でもいいです。
それがないと、原因が分からないので、おねがいします。
レスありがとうございます!
以下、一件分の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;;;;;
お手数かけます。よろしくお願いいたします。
手直しして使った為、私は問題なかったのですが念のためご報告です。
(ちなみに1000に直してもエラー出たので10000にしたらうまくいきました)
このツールでグループの復元ができて大変助かりました。
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")として取り込むようにしました。
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
ADRの行を見る限り、その行は問題なさそうですが、どこか別の行にあるADRに問題がありそうです。
なぜかセミコロンが入っていないADR行があるのではないか、ということが予想されます。
なので、セミコロンが足りない場合の対策を記述してみました。
これでうまくいくか試してみてください。
コメントありがとうございます。
今確認してみたところ、制限が100行に戻ってしまっていたので、1万行に設定しました。報告ありがとうございます。
コメントありがとうございます
> 手直しした点をご報告させていただきます。
丁寧にありがとうございます。
> 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")として取り込むようにしました。
拡張的なデータを取り込みたい場合の参考になります。ありがとうございました!
コメントありがとうございます
> auのreという機種ですが、一行が90文字で折り畳まれておりました。
>
> ADR;TYPE=POSTAL:;やたら長い住
> 所;;;;;
>
> 最初の行の解析時にエラーになります。
前のコメントでも指摘があったので、半角スペースで始まる行を、その手前の行に連結するように変更してみました。
> 海外住所はカンマ入ったりするので、\,か""でゴニョゴニョする場合の改造指南コメントなんか入っていると更に強力かも。
「"」については対応していたのですが「,」についても対応してみました。
CSV中の要素に「"」または「,」が含まれている場合は、その要素ごと「"」と「"」で挟み、含まれていた「"」を「""」にします。
> 文句タラタラっぽいですが誤解しないで下さい、神アプリですコレ。
ありがとうございます><
お世話になっております。
素晴らしい内容が書いてあり、参考に実行をしてみましたが、エラーが発生しました。
行: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
コメントありがとうございます
> VCFデータをワードで開き294を検索してみたところある友人のアドレスが294に該当するものでした。
実は、エラーメッセージの「294行」というのは、私が表示しているメッセージではなく、このスクリプトを実行しているプログラムが表示していて、VCFの行数ではなく、スクリプトの行数を指し示しています。すいません、紛らわしいですよね^^;
さて、このエラーなのですが、今現在の294行目は
「CSVRows(nRow) = Row」
です。
このエラーから考えられるのは、アドレス帳の件数が999件より多いのではないかと言うことです。
1000件以上でこのエラーが出るようになっていました。
なので、この999件という上限を、ためしに1万件にしてみたいと思います。
これで直るかどうか分かりませんが、一度試してみてください。
お世話になっております。
昨日質問させていたたいたものです。
早速の回答ありがとうございます。
実行してみたところ
うまく行きました!!
ありがとうございました。
このサイトと紹介されている素晴らしい内容が
広く世に広まるように願っております。
> 実行してみたところ
> うまく行きました!!
> ありがとうございました。
予想が当たったみたいで良かったです!
> このサイトと紹介されている素晴らしい内容が
> 広く世に広まるように願っております。
そんなたいした物じゃないのですが、グループをあきらめたり、手動で設定する人が多少なりとも減ればよいかな、と思っています。近くにスマートフォンデビューする人がいたら、是非教えてあげてください。
スマホ、gmail、PCの電話帳の中途半端な同期を整理したくて彷徨っていましたら、こちらに辿り着きました。
なんとか、csvになりました!感動です!
①コピーがうまくできなかったため、全文コピ→三桁の行番号をこつこつ削除
②電話番号の頭の'0'がcsvで見えなくなってしまったことの解決
これにドがつく素人の私は時間を要しました。
コメントありがとうございます
> なんとか、csvになりました!感動です!
なんとかなったようでよかったです^^
> ①コピーがうまくできなかったため、全文コピ→三桁の行番号をこつこつ削除
うまくコピーボタンが見つけられれば簡単なはずなのですが、うまくいかないときはそうなってしまいますね。
> ②電話番号の頭の'0'がcsvで見えなくなってしまったことの解決
Excelで開くと、そのように見えるだけで、とくに何かする必要はありません。(前のコメントにも書いてあります)
SH906iでバックアップした連絡先をエラーなくGMailにインポートすることができました。
グループ分けが反映されていてとても助かりました。
ありがとうございます。
コメントありがとうございます。
> SH906iでバックアップした連絡先をエラーなくGMailにインポートすることができました。
> グループ分けが反映されていてとても助かりました。
スマートフォンデビュー(かな?)おめでとうございます!
ありがとうございます!!
本当にありがとう!!!!
> 本当にありがとう!!!!
電話番号がちゃんと反映されない問題があることは知りませんでした。
コメント&動作報告ありがとございました!
ガラケーだと電話番号の設定を携帯とか自宅とかマークで設定出来るのですが、
それが「その他」になっていると、
そのまま突っ込むとダメなんです。
でもこのサイトの方法だと大丈夫でした!
> それが「その他」になっていると、
> そのまま突っ込むとダメなんです。
> でもこのサイトの方法だと大丈夫でした!
どういうわけか、その分類が原因でインポートできないことがあるみたいですね。
うまくいったようで良かったです。
コメントありがとうございました!
auでガラケー→iPhoneに乗り換えた際に、説明員さんの手違いがあって、アドレス帳が移行できなく困っていましたが、助かりました。
そんなこともあるんですね。お疲れ様です!
auのガラケーから移行したデータもiPhoneでうまく表示できるということがわかりました。
コメントありがとうございました!
元データは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,,,,,,,,,,
エクセルで普通に姓名の二列を別ファイルにして、読み込み直させるだけで出来ますね(汗
無事Googleには綺麗に入れることが出来ました。大変お世話になっております。
そことiOSとの連携が上手く行ってないですが、そっちも手作業で簡単に行けそうです。
ありがとうございました^^
コメントx2ありがとうございます。1つ目のコメントに返信できずじまいで申し訳ありません><
> こんばんは、上で相談させて頂いた者ですが、無事自己解決しました^^;
> エクセルで普通に姓名の二列を別ファイルにして、読み込み直させるだけで出来ますね(汗
エクセルでなんとかなったようで良かったです^^;
> 無事Googleには綺麗に入れることが出来ました。大変お世話になっております。
> そことiOSとの連携が上手く行ってないですが、そっちも手作業で簡単に行けそうです。
また何かあれば、今度は迅速に返信・対応したいと思いますので今後ともよろしくお願いいたします。
> ありがとうございました^^
こちらこそありがとうございました!
アドレス帖の移行にこれほど手間取るとは考えても見ませんでしたが、掲載のス
クリプトで大変助かりました。ありがとうございます。
私の場合、G9のvcfではグループ属性がCATEGORIESだったので、スクリプトの
該当属性X-GNを書き換えることでうまく行きました。
一部名前が多重表示されたりとかの不都合もありましたが、これはG9のアドレス
帖が姓と名を分離してないためで、ここは過去のコメントにもあるとおりあきら
めましたし、csvファイルを直接編集して対処しました。
しかし思うのですが、世界中でどれだけの人がスマホに乗り換えて同じ問題で悩
んでいるかということで、gmailなどはもっと高度なvcfトランスレータを提供
するべきじゃないんだろうかと思います。
このようなスクリプトも、PCのスキルをある程度持ってる人は理解できますが、
そうでない人にとってこの難題は悲劇のような事態だと思います。
携帯ごとに吐き出すvcfも様々な様ですが、受けはgmail一箇所なので機種ごとの
トランスレータは端末メーカーが責任もって作るべきだと感じますが、メーカー
は金にならない仕事はしないという結果がこの問題の根源かと思います。
でも、このスクリプトで救われてる人 多いんでしょうね。
よい仕事に感謝です。
コメントありがとうございます
> 私の場合、G9のvcfではグループ属性がCATEGORIESだったので、スクリプトの
> 該当属性X-GNを書き換えることでうまく行きました。
機種によってその部分もいろいろあるのですね。
時間があればCATEGORIESでも動作するようにしておきたいです。
> 一部名前が多重表示されたりとかの不都合もありましたが、これはG9のアドレス
> 帖が姓と名を分離してないためで、ここは過去のコメントにもあるとおりあきら
> めましたし、csvファイルを直接編集して対処しました。
はい、そこの部分をどうするべきかはいろいろ考え方があるとは思うのですが、
自分の環境でもっとも無難な方式でやってみたつもりです。
ただ、このことに関する意見が多いので、
ひょっとすると昔と挙動が変わっているのかもしれず、
どういう動作を標準とすべきか考え直す必要があるのかもしれないです。
> このようなスクリプトも、PCのスキルをある程度持ってる人は理解できますが、
できるだけ詳しくない人でも使えるようにVBScriptにしたつもりですが、
それでも難しめですよね。
アプリケーションにしたほうがよいのかもしれないですね。
> でも、このスクリプトで救われてる人 多いんでしょうね。
> よい仕事に感謝です。
自分自身この面倒具合があり得ないと思ったのでこのスクリプトを書きました。
なので、一人一人グループを再設定する、
なんていうあり得ない作業に挑もうとしている人に、
一人でも多く使ってもらいたいと思います。
ありがとうございました!
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のハイライト指定でしょうか。初見ですが綺麗に出ていますね
------------------------------
以上です。
長文のコメントをありがとうございます
> 初めまして。素晴らしいScriptありがとうございます。
お役に立てたようで光栄です^^
トラックバック先を拝見したところ、いろいろ大変だったようですね…
とりあえず、トラックバック先で指摘されていた1件目を読み込まないバグは修正しておきました。
> VBSを作成する時に何も考えずにUTF-8エンコーディングで保存してしまいました。
その可能性は考えたこと無かったです^^; 保存はShift-JISでお願いします。
(このコメントを読んでUTF-8やShift-JISがよく分からない場合は気にしないだけでOKのはずです)
> エラー(2)
(Twitterで連絡した通り)再現できなかったため、何も対策はしていません。
> # これってGoogleのハイライト指定でしょうか。初見ですが綺麗に出ていますね
ソースコードの表示のことでしょうか?現在ソースコードの表示にはSyntaxHighlighter2を使っています。配色は自分で設定したものです。
スクリプトがうまく動かないときは気軽にコメントしてください。
詳しいことは全く分かりませんが、書いてある通りにしたら、とても簡単に変換できました!感激です!ありがとうございました!!!!!!
携帯の通信料を削減すべくあれこれ検索してる際に本ブログを拝見しました。
Gmailへお手軽に電話帳の移行ができました本当にありがとうございます。
やりたい事が自分で作れる人ってすばらしいなぁと思います。
ありがとうございました★
Quoted Printable の対応、とっても心待ちにしております。
やはり難しいでしょうか?
スマホの電話帳編集がしたくて、色々探してここにたどりつきました。
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
できたらでいいです。
参考までに
ガラケー:auのPremier3
スマホ:GALAXY S3
vbsを使用させて頂いたところ、下記のエラーがはき出されました。対応して頂けるとありがたいです。宜しくお願い致します。
---------------------------
行: 141
文字: 16
エラー: インデックスが有効範囲にありません。: 'intLineNum'
コード: 800A0009
ソース: Microsoft VBScript 実行時エラー