我相信你的目标如下。
- 您希望降低脚本的处理成本。
- 在您的情况下,您想用大约 40 种模式替换文本。
修改点:
- 我认为
const 1A =、const 2B =等变量不能使用。请注意这一点。
- 关于
4D.replaceAllWith('xy's replacement');,在这种情况下,xy's replacement 没有被包围。请注意这一点。
- 关于
2B..replaceAllWith('2 B');,..不正确。
- 为了减少脚本的处理成本,在这个答案中,我想建议使用 Sheets API。使用 Sheets API 时,只需一次 API 调用即可将文本替换为大约 40 种模式。我认为这样可以降低工艺成本。
当以上几点反映到你的脚本中时,它变成如下。
修改脚本:
在使用此脚本之前,please enable Sheets API at Advanced Google services。
function printCombo() {
//general set up
const ss = SpreadsheetApp.getActive();
const psh=ss.getSheetByName('Print Sheet');
const scanrange= psh.getRange("Range to be scanned");
// I modified below script.
// Please set the replace patterns for this object. This object uses your patterns.
const replacePatterns = [
{ search: '1A', replace: '1 A' },
{ search: '2B', replace: '2 B' },
{ search: '3C', replace: '' },
{ search: '4D', replace: '4 ]D[ 4' },
{ search: 'xy', replace: "xy's replacement" }
];
const sheetId = psh.getSheetId();
const startRowIndex = scanrange.getRow() - 1;
const endRowIndex = startRowIndex + scanrange.getNumRows();
const startColumnIndex = scanrange.getColumn() - 1;
const endColumnIndex = startColumnIndex + scanrange.getNumColumns();
const requests = replacePatterns.map(({ search, replace }) => ({ findReplace: { range: { sheetId: sheetId, startRowIndex: startRowIndex, endRowIndex: endRowIndex, startColumnIndex: startColumnIndex, endColumnIndex: endColumnIndex }, find: search, replacement: replace } }));
Sheets.Spreadsheets.batchUpdate({ requests: requests }, ss.getId());
}
- 运行上述脚本时,
scanrange 的单元格值将使用replacePatterns 的替换模式进行替换。
注意:
- 关于您的
Bonus Question,在这种情况下,我认为可能需要使用上述修改的其他过程。因此,在这种情况下,我建议将其作为新问题发布。
参考资料:
补充:
根据您的以下回复,
这是一个很棒的解决方案,但是由于这是一个我需要能够让人们快速理解和使用的脚本,有没有办法在不激活高级工作表 API 情况的情况下进行这种设置?
下面的示例脚本怎么样?
function printCombo() {
//general set up
const ss = SpreadsheetApp.getActive();
const psh=ss.getSheetByName('Print Sheet');
const scanrange= psh.getRange("Range to be scanned");
// I modified below script.
// Please set the replace patterns for this object. This object uses your patterns.
const replacePatterns = [
{ search: '1A', replace: '1 A' },
{ search: '2B', replace: '2 B' },
{ search: '3C', replace: '' },
{ search: '4D', replace: '4 ]D[ 4' },
{ search: 'xy', replace: "xy's replacement" }
];
replacePatterns.forEach(({ search, replace }) => scanrange.createTextFinder(search).replaceAllWith(replace));
}