gpt4 book ai didi

google-apps-script - 为什么 copyTo(... PASTE_VALUES) 在宏中间不起作用?

转载 作者:行者123 更新时间:2023-12-02 03:35:59 30 4
gpt4 key购买 nike

我长期使用的电子表格技术之一是就地复制/粘贴特殊值 (C/PSV)。使用公式生成我感兴趣的值后,我 C/PSV 然后可以删除源数据。

所以我写了一个使用这种技术的宏,但是单元格最终还是空的。但是,如果我将宏分成两部分,在 C/PSV 之前结束第一个宏,那么一切都会按预期进行。为什么是这样?有没有更好的方法来解决这个问题?这是我的三个宏。

function Step1() {
var spreadsheet = SpreadsheetApp.getActive();
var range = spreadsheet.getActiveRange();
CopyRangeToNewSheet(spreadsheet, range);
spreadsheet.getCurrentCell().offset(-1, 6).activate();
FillInHeaders(spreadsheet);
spreadsheet.getCurrentCell().offset(1, -4).activate();
FillInFormulas(spreadsheet);
spreadsheet.getCurrentCell().offset(0, -4, range.getNumRows(), 5).activate();
spreadsheet.getCurrentCell().offset(0, 0, 1, 5).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};

function Step2() {
var spreadsheet = SpreadsheetApp.getActive();
var keepers = spreadsheet.getRange('G:J');
keepers.activate();
keepers.copyTo(keepers, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
var discard = spreadsheet.getRange('A:F')
discard.activate();
spreadsheet.getActiveSheet().deleteColumns(discard.getColumn(), discard.getNumColumns());
};

function BothSteps() {
var spreadsheet = SpreadsheetApp.getActive();
var range = spreadsheet.getActiveRange();
CopyRangeToNewSheet(spreadsheet, range);
spreadsheet.getCurrentCell().offset(-1, 6).activate();
FillInHeaders(spreadsheet);
spreadsheet.getCurrentCell().offset(1, -4).activate();
FillInFormulas(spreadsheet);
spreadsheet.getCurrentCell().offset(0, -4, range.getNumRows(), 5).activate();
spreadsheet.getCurrentCell().offset(0, 0, 1, 5).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
var keepers = spreadsheet.getRange('G:J');
keepers.activate();
keepers.copyTo(keepers, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
var discard = spreadsheet.getRange('A:F')
discard.activate();
spreadsheet.getActiveSheet().deleteColumns(discard.getColumn(), discard.getNumColumns());
};

function FillInHeaders(spreadsheet) {
spreadsheet.getCurrentCell().setValue('First Name');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setValue('Last Name');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setValue('Middle Name');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setValue('Email');
}

function FillInFormulas(spreadsheet) {
spreadsheet.getCurrentCell().setFormulaR1C1('=find(" ",R[0]C[-2])');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setFormulaR1C1('=if(iserr(R[0]C[-1]),R[0]C[-3],mid(R[0]C[-3],1,R[0]C[-1]))');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.getCurrentCell().setFormulaR1C1('=if(iserr(R[0]C[-2]),"",mid(R[0]C[-4],R[0]C[-2]+1,50))');
spreadsheet.getCurrentCell().offset(0, 2).activate();
spreadsheet.getCurrentCell().setFormulaR1C1('=R[0]C[-5]');
}

function CopyRangeToNewSheet(spreadsheet, range) {
var newSheet = spreadsheet.insertSheet(1);
spreadsheet.setActiveSheet(newSheet, true);
spreadsheet.getCurrentCell().offset(1, 0).activate();
range.copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}

这是电子表格本身,带有 Main、Result of Step1、Step2 和 Result of Combined Steps 选项卡: https://docs.google.com/spreadsheets/d/1_nabq_mHuegz_eMIPPAlIgonv71Jh6OPi6qKzeNGGTI/edit?usp=sharing

最佳答案

SpreadsheetApp.flush()可能是您的宏中缺少的步骤。基本上,Apps 脚本会在内部优化读取和写入,如果您不调用此方法,它可以按照自己的方式自由执行操作。

在您当前将任务分成“宏 1”和“宏 2”的位置添加此内容应该可以解决问题:

...
spreadsheet.getCurrentCell().offset(0, 0, 1, 5).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
// Force formulas to calculate and pending writes to be written.
SpreadsheetApp.flush();
// Read formula results and save as values.
var keepers = spreadsheet.getRange('G:J');
...

另一种方法是通过使用 setValues() 而不是 将您的脚本从录制宏的“事务性”方法压缩为批处理/高效的“大图” View >复制到:

...
SpreadsheetApp.flush();
var toKeep = spreadsheet.getRange('G:J');
toKeep.setValues(toKeep.getValues());
toKeep.getSheet().deleteColumns(1, toKeep.getColumn() - 1);
}

请注意,您仍然需要调用 .flush()

关于google-apps-script - 为什么 copyTo(... PASTE_VALUES) 在宏中间不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50192942/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com