Edited at

SharePointのリストをクリップボードにコピーする

SharePointのリストは、選択しようとするとドラッグしようとしてしまったり、リスト項目の選択操作になってしまったりして、単純に文字列をクリップボードにコピーしたい などといったことができません。

こんな時はWebコンソールの出番です。


  1. 該当のリストを表示する

  2. クリップボードにコピーしたい項目のみを表示したい順番で表示するビューを作る


  3. Webコンソールを開く

  4. コンソールに以下のコードを入力する

  5. コンソールに表示された文字列をクリップボードにコピーする


Webコンソールに貼り付けるコード

let a = "";

document.querySelector(".ms-DetailsList-contentWrapper").querySelectorAll(".ms-List-cell").forEach((e) => {
e.querySelectorAll(".ms-DetailsRow-cell").forEach((l) => {
a += !l.classList.contains("ms-DetailsRow-cellCheck") && l.textContent != "" ? l.textContent.trim() + "\t" : "";
});
a += "\n";
});
console.log(a);


スクリーンショット部分のみの出力例

2019/07/14   SBC://5

2019/07/17 Facelook Part.8
2019/07/19 もくもく会@にしとも広場


やっていること

ms-DetailsList-contentWrapperというのは、SharePointのリストテーブルの「データ部分のみ」を囲んでいるdivのクラスです。HTMLのテーブルでいうtbodyみたいなものです。

この要素内のms-List-cellクラスを取得すると、すべての行が、その下にある`ms-DetailsRow-cellというクラスを取得するとその中の各セルが取得できます。

そのなかの「テキスト部分だけ」を出力し組み合わせていくことで、リストのテキスト部分のみを抽出できます。

ただし、このままだと各行のチェックボックスまで抽出してしまうため、チェックボックスセルに付いているms-DetailsRow-cellCheckというクラスを検出して、それを出力から除外します。


ブックマークレットにしました

比較的頻繁に使うので、ブックマークレットにしました。ついでに以下の機能を追加しています


  • リスト中のどの項目もチェックしていない場合は、すべての項目をコピー

  • リスト中のいずれかの項目がチェックされていたら、それらの項目をコピー

また、コピーできる文章は開発者モードのコンソールではなく、新しいウィンドウに表示されますので、全選択してコピーします。

javascript:a="";f=null==document.querySelector(".ms-DetailsRow-cellCheck div:first-child[aria-checked=true]");document.querySelector(".ms-DetailsList-contentWrapper").querySelectorAll(".ms-List-cell").forEach(function(c){if("true"===c.querySelector(".ms-DetailsRow-cellCheck div:first-child").getAttribute("aria-checked").toLowerCase()||f)c.querySelectorAll(".ms-DetailsRow-cell").forEach(function(b){a+=b.classList.contains("ms-DetailsRow-cellCheck")||""==b.textContent?"":b.textContent.trim()+"\t"}),a+="\n"}); window.open("about:blank").document.write("<pre>"+a+"</pre>");

コンパイラはいつものを使いました。コンパイル前のソースはgistに公開しています。