エラー:キャストできません

添付資料のsheet「一覧」があり、請求管理NOを1行ずつ、
sheet「請求書」の請求管理NOに書き込み、請求書をPDF化し、同じメールアドレスごとメールを作成したいです。
「当月請求有無」が「有」で、同じメールアドレスの場合は、メールは1通で、各社のPDF化したすべての請求書を添付したいです。
Book1.xlsx (12.8 KB)

現在のフローは、
現在のフロー.xlsx (109.5 KB)

下記のようなエラーが出ます。
キャプチャ

ご教授いただけませんでしょうか。

こんにちは

繰り返し(コレクションの各要素)のTypeArgumentをKeyValuePair<string,string[]>にしてあげる必要があるかと思います。
あるいは、イテレーションの対象をdict.Keys としてTypeArgumentはstringでも良いかと思います。

ご返信いただきありがとうございます!
エラーをなくすことができました。

度々すみません。同じメールアドレスが何通も作成されていました。
私が下記の質問の時、誤った伝え方をしてしまいました。
せっかく教えていただいたのに申し訳ございません。
実際のデータは、こちらの質問の添付資料sheet「一覧」のように、お客様名がセルの結合をされていて、ひとつの請求管理NOに対してメールアドレスがふられているようになります。

dictの代入の式でしょうか。
ご教授いただけませんでしょうか。

こんにちは

メールアドレスをDictionaryのキーにしているので、同じメールアドレスのメールが複数できることはないように思えますが....どのように処理していますでしょうか?

ご連絡ありがとうございます!現在の処理はこのようになっています。

現在のフロー.xlsx (196.8 KB)

こんにちは

「dt一覧」に対して2重処理になっていると思います。
dictに「dt一覧」の内容をすべて詰め込んでいるので、その外側のdt一覧の繰り返しは不要かと思います。

ご連絡いただきましてありがとうございます。

外側の繰り返しをなくし、Excelアプリケーションスコープから始めましたが、
「引数Condition 現在のコンテキストにRowという名前は存在しません」
とのエラーが出ます。

ファイルを圧縮のアクティビティにもこちらのエラーがあるのですが、Rowは使えなくなるのでしょうか。

度々すみません。

こんにちは

条件分岐は単なるフィルターとして機能しているようなので、Dictionaryを作成する際にフィルターをすれば良いように思えます。例えば以下の様になると思います。

dict = dt.AsEnumerable().Where(r=>r["当月請求有無"].ToString()=="有" AndAlso row["請求書送付方法"].ToString().Contains("メール")).GroupBy(r=>r["メールアドレス(1)"].ToString()).ToDictionary(g=>g.Key,g=>g.Select(r=> r["請求管理No"].ToString()).ToArray())

ファイルを圧縮のアクティビティにもこちらのエラーがあるのですが、Rowは使えなくなるのでしょうか。

請求管理NoはDictionaaryの値として含まれているので、そこから引き出せます。

最後に別の列のアドレスを追加していますが、これはあまりいただけないように思えます。
このような条件があるのであれば、グルーピングのキーは2つのアドレスの組みにした方が良いかもしれません。

ご連絡が遅くなり申し訳ありません。

丁寧にご教授いただきましてありがとうございます・・!
C#で作成しています。下記のように入れたのですが、dictの代入のところでエラーがでました。
毎回わからずすみません。

Dt一覧.AsEnumerable().Where(r=>r[“当月請求有無”].ToString()==“有” AndAlso row[“請求書送付方法”].ToString().Contains(“メール”)).GroupBy(r=>r[“メールアドレス(1)”].ToString()).ToDictionary(g=>g.Key,g=>g.Select(r=> r[“請求管理No”].ToString()).ToArray())
キャプチャ

また、アドレスの追加についてご教授いただきありがとうございます。
dictの代入のところでメールアドレスが2つある場合、2つとも一致すれば同じメールにPDFを添付できる式にできるということでしょうか。それができるのならばとてもありがたいです。

こんにちは

すみません、C#とVBが混在していました。AndAlsoの部分を && にしてみてください。

dictの代入のところでメールアドレスが2つある場合、2つとも一致すれば同じメールにPDFを添付できる式にできるということでしょうか

2つのメールアドレスの組をキーとします。ただし単純な実装ですと、入れ替わった状態は異なるものとみなされます(元の実装でも同様かと思いますが)
もしDesktop版Outlookのようにセミコロン区切りで宛先文字列を渡せるのであれば、あらかじめそのようにします。あるいは複数の文字列で保持する必要がある場合は、Tuple等を使います。下記は前者の例です。

dt.AsEnumerable().Where(r=>r["当月請求有無"].ToString()=="有" && r["請求書送付方法"].ToString().Contains("メール")).GroupBy(r=>(r["メールアドレス(1)"].ToString()+";"+r["メールアドレス(2)"].ToString()).Trim(';')).ToDictionary(g=>g.Key,g=>g.Select(r=> r["請求管理No"].ToString()).ToArray())

ご教授いただきありがとうございます!
outlookの宛先はセミコロン区切りとなっているため、ご教授いただいた式を使用させていただきました。

ファイル名を各請求管理Noに設定しています。
ファイル圧縮時などの「zip圧縮するコンテンツ」にファイルの宛先をいれるさいに下記のように設定しましたが、 やはり「現在のコンテキストにRowという名前は存在しません」とのエラーがでます・・。

“デスクトップ\”+ Row[52].ToString()+“.pdf”

こんにちは

なのでDataTableからとってくる必要はありません。
このプロパティはファイル名をパイプ(|)で連結すると複数指定できるようなので、Dictionaryの値からこれを生成します。例えば以下のようになると思います。

String.Join("|",item.Value.Select(n=>"c:\\temp\\"+n+".pdf"))

ご教授いただきありがとうございます!

エラーをなくすことができました。一度ロボットを稼働させてみたのですが
ファイルを圧縮のところで「パスに無効な文字が含まれています」とのエラーがでました・・

"c:\temp\"は、フォルダのパスになるということで間違いないでしょうか。

現在は下記のように設定しています。
String.Join(“|”,item.Value.Select(n=>“フォルダのパス”+Dtフォルダ名.ToString()+“メール送信用\”+n+“.pdf”))

※メール送信用の後の\は二つ記入しています。

こんにちは

とりあえずは

String.Join(“|”,item.Value.Select(n=>“フォルダのパス”+Dtフォルダ名.ToString()+“メール送信用\”+n+“.zip”))

をWriteLineあるいはLogMessage等を用いて中身が自分の意図しているものと一致しているか確認してみてください。なおC#では\はエスケープ文字なので、文字として扱う場合は2つ重ねる必要があります。

思っていたようになっていました!ありがとうございます。

度々すみません。
pdfは同じメールアドレスのものはまとめるので下記でよいのですが、
String.Join(“|”,item.Value.Select(n=>“フォルダのパス”+Dtフォルダ名.ToString()+“メール送信用\”+n+“.pdf”))

zipはひとつにし、一番最初の行の請求管理Noをファイル名につけたいです。
また、dictの代入の式に入っていない列(顧客名)をメールの文章にいれたいのですが、
顧客名はどのように設定するべきなのでしょうか。

こんにちは

zipはひとつにし、一番最初の行の請求管理Noをファイル名につけたいです。

Dictionaryの値をとってきて、それの最初の要素を取得すれば良いかと思います。
上記ですと item.Value[0] で良いように思えます。

また、dictの代入の式に入っていない列(顧客名)をメールの文章にいれたいのですが、
顧客名はどのように設定するべきなのでしょうか。

これは現在のDictionaryに含まれていないので、別のDictionaryを作成するか、DataTableに探しに行くか等のアプローチになるかと思います。

ご連絡が遅くなり申し訳ありません。
zipのフォルダをとれました!
ありがとうございました!

また、せっかくご教授いただきましたのに情報が小出しになってしまいまして申し訳ございません。

データテーブルを読み込んだあと、Row[“顧客名”]で表示させようとしましたができず、
できればDictionaryに含んだ式を教えていただけませんでしょうか。

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.