目次
フェイスブックでは、「友達になる」というものがありますが、
他のSNSでも、同様の機能があります。
OpenPNEという国産のSNSシステムでも、
フェイスブックの「友達になる」と同様の「フレンド申請」があります。
個人的には、なにもしない方ですが、
某SNSでは、「フレンド申請しよう」と思いました。
挨拶のメッセージを兼ねてフレンド申請するわけですが、
やっぱりこのサイトを知ってもらいたいというのがあるんですね。
そこで、「フレンド申請」するためには、まだフレンドになっていない人に対して、
「フレンド申請」する必要があると思いました。
たぶんシステム側では、フレンドになっているのに
「フレンド申請」ができることはないと思いますが、
エクセル(グーグルスプレッドシート)に、
「申請中」や「申請却下」という情報を管理しながら、
「フレンド申請」しようと思いました。
そこで、まずはメンバーリストの収集ということで、
前回の「OpenPNEのメンバーリストを取得する」というブログを作成し、
ちょっとしたツールも作成しました。
前回のツールで、全メンバーリストをページ単位で
エクセル(グーグルスプレッドシート)にはりつけ、
同様に、フレンドのメンバーリストもエクセル(グーグルスプレッドシート)にはりつけ、
最終的には、フレンドか、そうでないかがわかるようにして、
そこから、フレンド申請をしようと思いました。
で、自分のためにツールを作りました(笑)。
ツールが意図した通りに動作するか検証するためには、
テストデータが必要となります。
そこで、簡単なデータを作成しました。
かごAの中に、「りんご、ばなな、トマト、かぼちゃ、じゃがいも」が、あります。かごBの中に、「じゃがいも、トマト、レタス」があります。マージして一覧表示してください。
マージ(merge)とは「併合する」、「合併する」という意味であり、情報工学の用語としてよく用いられる。 広義には複数のデータベースやファイル、プログラムなどを一つにまとめる行為を意味する。 狭義には以下で述べる二つの線形リストを一つにまとめるアルゴリズムのことである。
Wikipediaより
エクセル(グーグルスプレッドシート)で、コピペすると、タブ区切りとなります。
上記データもタブ区切りとなっています。
左がCODE(IDやKEY)、右がデータ名です。
マージした場合に、メインかサブかの区別をつけるために、
メインではデータ名の最後に1をつけました。
メインと同様に、タブ区切りで、
サブの場合は、データ名の最後に2をつけました。
※ほかには「数値型」があります。
※テストデータは2項目ですが、テストデータが5項目ある場合は、
5を選択すると、一覧にそのまま表示されます。
※ほかには、「降順」があります。
※ほかには、「重複なし(メイン優先)」「重複なし(サブ優先)」があります。
サブのデータは、水色をつけました。
CODEの型:数値型
有効データ項目数:2
一覧の並び順:昇順
一覧の重複:重複あり(マージ状態)
※実行結果1のCODEの型を数値型にした状態
<!---=================================================================
chkData
==================================================================--->
<cffunction name="chkData" access="public" returnType="void" output="no">
<cfset var qData1 = "">
<cfset var qData2 = "">
<cfset var qData3 = ""> <!--- 結果用 --->
<cfset qData1 = getData(form.d1, "1")>
<cfset qData2 = getData(form.d2, "2")>
<cfquery name="qData3" dbtype="query">
select *
from qData1
union
select *
from qData2
order by code #form.sort#, chk
</cfquery>
<!--- 重複チェック(CODEが重複したデータのflgに*をセット --->
<cfset old_code = "">
<cfloop query="qData3">
<cfif old_code eq qData3.code>
<cfset QuerySetCell(qData3, "flg", "*", qData3.currentRow -1)>
<cfset QuerySetCell(qData3, "flg", "*", qData3.currentRow)>
<cfelse>
<cfset old_code = qData3.code>
</cfif>
</cfloop>
<!--- 重複なし(メイン優先) --->
<cfif form.jfuku eq "2">
<cfquery name="qData3" dbtype="query">
select *
from qData3
where not (flg = '*' and chk='2')
</cfquery>
</cfif>
<!--- 重複なし(サブ優先) --->
<cfif form.jfuku eq "3">
<cfquery name="qData3" dbtype="query">
select *
from qData3
where not (flg = '*' and chk='1')
</cfquery>
</cfif>
<cfset request.qData = qData3>
</cffunction>
<!---=================================================================
getData
==================================================================--->
<cffunction name="getData" access="public" returnType="query" output="no">
<cfargument name="data" type="string" required="yes">
<cfargument name="flg" type="string" required="yes">
<cfset var qData = "">
<cfset var sType = "varchar">
<cfset var sFld = "code">
<!--- keyの型が数値 --->
<cfif form.kata eq 2>
<cfset sType = "integer">
</cfif>
<!--- 項目,型 --->
<cfloop index="idx" from="2" to="#form.fcnt#">
<cfset sType = ListAppend(sType, "varchar")>
<cfset sFld = ListAppend(sFld, "fld#idx#")>
</cfloop>
<cfset sType = ListAppend(sType, "varchar,varchar")>
<cfset sFld = ListAppend(sFld, "chk,flg")>
<!--- query生成 --->
<cfset qData = QueryNew(sFld, sType)>
<!--- データセット --->
<cfloop index="line" list="#arguments.data#" delimiters="#request.CRLF#">
<!--- タブ区切りのスペースデータを追加(データが指定項目数より少ないことを防ぐため) --->
<cfloop index="idx" from="2" to="#form.fcnt#">
<cfset line = ListAppend(line, " ", request.TAB)>
</cfloop>
<cfset QueryAddRow(qData)>
<cfloop index="idx" from="1" to="#form.fcnt#">
<cfset tmp = trim(ListGetAt(line, idx, request.TAB))>
<cfif idx eq 1>
<cfset QuerySetCell(qData, "code", tmp)>
<cfelse>
<cfset QuerySetCell(qData, "fld#idx#", tmp)>
</cfif>
<cfset QuerySetCell(qData, "chk", arguments.flg)>
</cfloop>
</cfloop>
<cfreturn qData>
</cffunction>
作成したデモは、こちらです。
自分が欲しいと思ったツールを作りましたが、
案外ほかにも利用価値がありそうな気がします。
大量のデータであれば、データベースを使った方が、楽に処理できますが、
データベースを使うほどでもない、微妙なデータ件数であれば、
こちらのツールが役にたつかもしれません。