Secret Santa - Revisited
Javascript ES6, 191

This solution returns all possible pairings as a list of list of pairs:

f=l=&gt;(h=l=&gt;l.length,n=l.map(i=&gt;i.shift()),o=[],(r=s=&gt;(g=h(s))&lt;h(n)?l[g].map((e,x)=&gt;e&amp;&amp;r([...s,x])):o.push([...s]))([]),o.filter(i=&gt;h([...new Set(i)])==h(n)).map(l=&gt;l.map((t,f)=&gt;[n[f],n[t]])))


Example run:

&gt;&gt; example = f([
    ["Alice", 0, 0, 1, 1, 1, 1, 1],
    ["Bob",   0, 0, 0, 0, 0, 1, 0],
    ["Carla", 1, 1, 0, 0, 0, 1, 1],
    ["Dan",   1, 1, 0, 0, 0, 1, 1],
    ["Erin",  1, 1, 0, 0, 0, 1, 1],
    ["Frank", 1, 1, 1, 1, 1, 0, 1],
    ["Gary",  1, 1, 1, 1, 1, 1, 0]])

&lt;&lt; Array [ Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], 26 more… ]

&gt;&gt; example[0]

&lt;&lt; Array [ "Alice:Carla", "Bob:Frank", "Carla:Alice", "Dan:Bob", "Erin:Gary", "Frank:Dan", "Gary:Erin" ]