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に公開しています。