Pen Settings

HTML

CSS

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URLs added here will be added as <link>s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.

+ add another resource

JavaScript

Babel includes JSX processing.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Packages

Add Packages

Search for and use JavaScript packages from npm here. By selecting a package, an import statement will be added to the top of the JavaScript editor for this package.

Behavior

Auto Save

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

Format on Save

If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.

Editor Settings

Code Indentation

Want to change your Syntax Highlighting theme, Fonts and more?

Visit your global Editor Settings.

HTML

              
                
<div class="container">
  <div class="past-data">
    <p style="margin-top:0; padding:0.3em;background:#ebebeb;">貼り付け用データ</p>
   <pre>
セルA-1	セルB-1	セルC-1	
セルA-2	セルB-2	セルC-2	セルD-2
セルA-3	セルB-3	セルC-3	セルD-3
セルA-4	セルB-4	セルC-4	セルD-4
セルA-5	セルB-5		セルD-5
セルA-6		セルC-6	セルD-6
セルA-7	セルB-7	セルC-7	セルD-7
	セルB-8	セルC-8	セルD-8
	セルB-9	セルC-9	セルD-9
	セルB-10	セルC-10	
   </pre>
  </div>

  <button id="clear_btn" style="margin-top:30px">クリア</button>
  <div id="input_wrap">
    <!-- Input要素を作成 -->
  </div>
</div>


              
            
!

CSS

              
                .container{
  margin-top:20px;
  max-width: 960px;
  margin-left: auto;
  margin-right: auto;
}
.past-data {
  padding:10px;
  border:1px solid #ccc;
  border-radius:8px;
}
#input_wrap > div {
  display: flex;
  justify-content: space-between;
}
input {
  width: 22%;
  margin:4px;
  border:0;
  padding:10px;
  border:solid 1px #ccc;
  border-radius: 3px;
}
.starting-point {
  animation-duration: 0.2s;
  animation-fill-mode:forwards;
  animation-name: slidein;
  background-color:  rgba(247,246,246,1);
  opacity: 0;
}
@keyframes slidein {
    0%     {opacity:0;}
    50.0%  {opacity:0.5}
    100.0%  {opacity:1;}
}
              
            
!

JS

              
                const inputWrap = document.querySelector('#input_wrap');
const clearBtn = document.querySelector('#clear_btn');

window.addEventListener('DOMContentLoaded', function(){
  // input要素を作成する
  InputFactory(60, 4, inputWrap);
});

// input要素を作成
function InputFactory(row, col, parentNode) {
  for (let i = 0; i < row; i++) {
    const createDiv = document.createElement('div');
    for (let j = 0; j < col; j++) {
      const createInput = document.createElement('input');
      createInput.type = 'text';
      createInput.name = `input${i}-${j}`;
      createDiv.appendChild(createInput);
      const pastInput = new PastInput(createInput);
    }
    parentNode.appendChild(createDiv);
  }
}

// ペーストした時の処理
class PastInput {
  constructor(target) {
    this.target = target;
    this.event();
  }
  event() {
    this._getInputRowCol();
  }
  // ペーストした時のInputの位置(rowとcol)を取得
  _getInputRowCol() {
    const target = this.target;
    // ペーストイベント
    target.addEventListener('paste', (e) => {
      // ターゲット要素(input)
      const targetInput = e.target;
      // 全てのDIV要素取得
      const divAll = inputWrap.querySelectorAll('div');
      console.log(divAll)
      // 全てのInput要素取得
      const inputAll = inputWrap.querySelectorAll('input');
      // ターゲットの親要素(DIV)取得
      const targetDiv = targetInput.parentNode;

      // 全てのDiv要素取得をArrayに変換
      const divAllAry = Array.from(divAll);
      // 全てのInput要素取得をArrayに変換
      const inputAllAry = Array.from(inputAll);

      // ターゲット要素のrowとcolインデックスを取得
      const rowIndex = divAllAry.indexOf(targetDiv);
      const colIndex =
        inputAllAry.indexOf(targetInput) % targetDiv.children.length;

      // ペーストした値をInput要素に反映
      this._textPaste(rowIndex, colIndex);
      console.log(rowIndex, colIndex)
    });
  }
  _textPaste(row, col) {
    // ペーストしたInput要素を取得
    const target = this.target;

    setTimeout(() => {
      // ペーストしたInput要素のテキスト取得
      const pasteText = target.value;
      // ペーストしたInput要素のテキストを配列に変換
      const pasteAry = pasteText.split(' ');

      // テキストをそれぞれのInput要素に分割して反映
      pasteAry.forEach((pastItem, index) => {

        const currentDiv = inputWrap.children[row + index];
        console.log(inputWrap.children)
        const resultItem = pastItem.split(/\t/);

        // Input要素があればテキストを反映
        if (currentDiv !== undefined) {
          for (let i = 0; i < resultItem.length; i++) {
            const currentInput = currentDiv.children[col + i];
            if (currentInput !== undefined) {
              currentInput.value = resultItem[i];
              // 背景色追加のCSS追加
              currentInput.classList.add('starting-point');
               // 背景色追加のCSS削除
              setTimeout(() => {
                currentInput.classList.remove('starting-point');
              }, 500);
            }
          }
        }
      });
    });
  }
}

// データを全てクリアする
clearBtn.addEventListener('click', (e) => {
  const inputAll = inputWrap.querySelectorAll('input');
  // 全てのInput要素をArrayに変換
  const inputAllAry = Array.from(inputAll);
  for (let i = 0; i < inputAllAry.length; i++) {
    const targetInput = inputAllAry[i];
    targetInput.value = '';
  }
});





              
            
!
999px

Console