可以导入范围将所有内容移动到一个列中

时间:2017-08-26 18:30:22

标签: google-sheets

我的团队负责人提交一份表格,其中包含团队成员的姓名和电子邮件(每个团队最多8封电子邮件),其中填写了一份主列表。我想将这些电子邮件导入到新表的单个列中(从单元格CO2:CO20; CR2:CR20; CU2:CU20等等到一列)

我可以看到多个importrange字符串是如何被“;”分隔的会工作,但考虑到我需要堆叠命令的次数,它似乎效率低下。有更好,更快的方式吗?

1 个答案:

答案 0 :(得分:0)

Lots To One

此脚本允许您选择多个列,并以a1表示法创建这些范围的逗号分隔字符串。

由于这是一个无模式对话框,您可以继续选择范围并在每个按钮后按“添加”按钮,它将继续构建字符串。

您可能不会一次选择多个柱状范围,但您可以复制字符串并保存在某处,然后将其粘贴到文本区域并单击加载按钮,它将一次保存所有范围。

加载完所有范围后,选择要将所有这些值复制到的列的顶部单元格,然后单击“复制”按钮。它一次复制所有。如果您自己构建csv字符串,则仅使用逗号分隔字符串。空间不足。没有引号。

按钮上有工具提示,以防您忘记他们的操作。

Code.gs:

function lotsToOneMenu()//this creates of Lots to One Tools Menu
{
  SpreadsheetApp.getUi().createMenu('LotsToOne Tools')
    .addItem('Copy Lots To One', 'copyLotsToOne')
    .addToUi();
}
function copyLotsToOne()//This is the main function which starts the ball rolling.
{
  clearCurrentRangeList();
  var ui=HtmlService.createHtmlOutputFromFile('lots2one');
  SpreadsheetApp.getUi().showModelessDialog(ui, 'Copy Lots of Columns To One');
}

function copyToColumn()//This copies all of the range values into one array and copies to final column
{
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getActiveRange();
  var rgRow=rg.getRow();
  var rgCol=rg.getColumn();
  var rgL=getCurrentRangeList();
  var rgA=rgL.split(',');
  var vA=[];
  for(var i=0;i<rgA.length;i++)
  {
    var rgA1vA=sh.getRange(rgA[i]).getValues();
    for(j=0;j<rgA1vA.length;j++)
    {
      vA.push([rgA1vA[j]]);
    }
  }
  sh.getRange(rgRow,rgCol,vA.length,1).setValues(vA);
}

function addSelectedRange()//This adds one column to the current range at a time
{
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getActiveRange();
  var rgA1=rg.getA1Notation();
  appendCurrentRangeList(rgA1);
  return getCurrentRangeList();
}

function appendCurrentRangeList(rgA1)//This is used by above function to append to the string.
{
  var current=getCurrentRangeList();
  if(current)
  {
    current+=',' + rgA1;
  }
  else
  {
    current=rgA1;
  }
  putCurrentRangeList(current)
}

function getCurrentRangeList()
{
  var props=PropertiesService.getScriptProperties();
  var crl=props.getProperty('CurrentRangeList');
  return crl;
}

function putCurrentRangeList(rgA1)
{
  var props=PropertiesService.getScriptProperties();
  props.setProperty('CurrentRangeList',rgA1)
}

function clearCurrentRangeList()
{
  var props=PropertiesService.getScriptProperties();
  props.setProperty('CurrentRangeList', '')
}

lots2one.html

<!DOCTYPE html>
<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
      function addARange()
      {
        google.script.run
          .withSuccessHandler(dispRange)
          .addSelectedRange();
      }
      function dispRange(rl)
      {
        $('#txt1').val(rl);
      }
      function setRange()
      {
        var rs=$('#txt1').val();
        google.script.run.putCurrentRangeList(rs);
      }
      function copyToColumn()
      {
        google.script.run.copyToColumn();
      }
    </script>
    <style>#btn1{float:right;margin:0 0 0 50px;}#txt1{width:100%;}#btn2{margin:0 0 0 20px;}</style>
  </head>
  <body>
    <div id="div1">
      <textarea id="txt1" rows="4" cols="35"></textarea>
      <br /><input id="btn0" type="button" value="Add" title="Select a Columnar Range and Click Add" onClick="addARange();" />
      <input id="btn2" type="button" value="Load" title="Loads s string of A1Notation columns separated by commas only" onClick="setRange();" />
      <input id="btn1" type="button" value="Copy" title="Select Top of Destination Column and Click onCopy" onClick="copyToColumn();" />
    </div>
  </body>
</html>

这是对话框的样子:

enter image description here

输入和输出:

enter image description here