Google apps script google sheets脚本在添加行时运行,并将结果复制到不同的工作表

Google apps script google sheets脚本在添加行时运行,并将结果复制到不同的工作表,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我一直在运行一个脚本,它通过与源数据不同的工作表上的函数将逗号分隔的数据拆分成新行。数据量不断增加,计算也需要花费很长时间 示例电子表格如下(包含少量数据): 脚本如下所示: function extract(range, colToSplit, delimiter) { var resArr = [], row; range.forEach(function (r) { r[colToSplit-1].replace(/(?:\r\n|\r|\n)(\d|\w)/g," , ").

我一直在运行一个脚本,它通过与源数据不同的工作表上的函数将逗号分隔的数据拆分成新行。数据量不断增加,计算也需要花费很长时间

示例电子表格如下(包含少量数据):

脚本如下所示:

function extract(range, colToSplit, delimiter) {
var resArr = [], row;
range.forEach(function (r) {
    r[colToSplit-1].replace(/(?:\r\n|\r|\n)(\d|\w)/g," , ").split(delimiter)
        .forEach(function (s) {
            row = [];
            r.forEach(function (c, k) {               
                row.push( (k === colToSplit-1) ? s.trim() : c);
            })
            resArr.push(row);
        })
})
return resArr;}
问题是,如何仅针对新数据运行此脚本,并将结果复制到不同的“没有公式的静态”工作表中,而不是针对所有数据的每次更改都运行脚本


向脚本神致以崇高的敬意。

您可以使用脚本,通过编辑器或工作表中的按钮触发脚本,而不是使用单元格函数。通过这样做,您将受益于他们的6分钟时限(请参阅)

可以这样修改该函数,然后将其分配给要作为onClick事件运行的按钮(详细信息):

函数提取(){
var resArr=[],第行;
var colToSplit=6;
var分隔符=“,”;
range=SpreadsheetApp.getActive().getSheets()[0].getDataRange().getValues();
范围。forEach(函数(r){
r[colToSplit-1]。替换(/(?:\r\n |\r |\n)(\d |\w)/g,“,”)。拆分(分隔符)
.forEach(功能){
行=[];
r、 forEach(函数(c,k){
行推送((k==colToSplit-1)?s.修剪():c);
})
重新驻车推(世界其他地区);
})
})
SpreadsheetApp.getActive().getSheets()[1].getRange(1,1,resArr.length,resArr[0].length).setValues(resArr);
}

如果您还有其他问题,请告诉我。

您可以在侧边栏中创建函数的html,非常简单,如下所示:

function showButtonDialog() {
  var ss=SpreadsheetApp.getActive();
  var html='<input type="text" id="rng" /> Range<br /><input type="text" id="col" /> Column<br /><input type="text" id="dlm" /> Delimiter<br /><input type="button" value="run extract" onClick="extract();" />';
  html+='<script>function extract() {google.script.run.extract(document.getElementById("rng").value,document.getElementById("col").value,document.getElementById("dlm").value);}</script>';
  var userInterface=HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showSidebar(userInterface);
}

你可能需要稍微调整一下你的函数。但是从代码的外观来看,你不会有任何问题。

我看到你没有接受我之前的答案;我想这已经不符合你的目的了。在这里,我提供了另一个解决方案,按照您最初的要求执行—即仅处理新行。这是通过使用

请参见以下所有代码:

var COL_TO_SPLIT=6;
var分隔符=“,”;
var NUM_COLUMNS=16;
函数提取(范围、colToSplit、分隔符){
var-resArr=[];
范围。forEach(函数(r){
r[colToSplit-1]。替换(/(?:\r\n |\r |\n)(\d |\w)/g,“,”)。拆分(分隔符)
.forEach(功能){
var行=[];
r、 forEach(函数(c,k){
行推送((k==colToSplit-1)?s.修剪():c);
});
重新驻车推(世界其他地区);
});
});
回报率;
}
函数getCurrentRow(){
var currentRow=PropertiesService.getScriptProperties().getProperty('currentRow');
如果(currentRow==null){
currentRow=2;
}
返回parseInt(currentRow);
}
函数updateCurrentRow(newRow){
PropertiesService.getScriptProperties().setProperty('currentRow',newRow);
}
//返回新的“currentRow”
函数migrateRowsFrom(行){
var ss=SpreadsheetApp.getActive();
var sourceSheet=ss.getSheetByName('Sheet1');
var destinationSheet=ss.getSheetByName('Sheet2');
var rowsToProcess=sourceSheet.getLastRow()-row+1;

如果(rowsToProcess个人而言,我不会将其作为单元格函数运行。单击按钮对我来说没什么大不了的。嘿,Jairo,我发布了一个新的解决方案。让我知道它是否适用于您。谢谢。我尝试过使用手动按钮运行脚本,但过程更慢。我正在考虑一个只处理新entri的解决方案删除并将结果写入不同的工作表。是否可以通过脚本执行此操作?
function extract(a,b,c) {
  Logger.log('rng: %s col: %s del: %s',a,b,c);
}