我的团队负责人提交一份表格,其中包含团队成员的姓名和电子邮件(每个团队最多8封电子邮件),其中填写了一份主列表。我想将这些电子邮件导入到新表的单个列中(从单元格CO2:CO20; CR2:CR20; CU2:CU20等等到一列)
我可以看到多个importrange字符串是如何被“;”分隔的会工作,但考虑到我需要堆叠命令的次数,它似乎效率低下。有更好,更快的方式吗?
答案 0 :(得分:0)
此脚本允许您选择多个列,并以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>
这是对话框的样子:
输入和输出: