查找和替换范围内单元格的多个字符串的最有效方法是什么



**背景**

  • 我正在编写一个在格斗游戏中制作连击的代码
  • 我需要取一个范围,然后将某些数字和/或字母转换为其他数字/和/或带有额外字符/间距的字母,以便程序注册组合

现在我有一些代码可以完成任务,但我不相信这是";右";也没有有效的方法来做到这一点,因为总共将有大约40〃;开关";待设置:

function printCombo()  {
//general set up
const ss=SpreadsheetApp.getActive();
const psh=ss.getSheetByName('Print Sheet');
const scanrange= psh.getRange("Range to be scanned");
//set constants and text they are being replaced with
const 1A = scanrange.createTextFinder('1A');
1A.replaceAllWith('1 A');
const 2B = scanrange.createTextFinder('2B');
2B..replaceAllWith('2   B');
const 3C = scanrange.createTextFinder('3C');
3C.replaceAllWith('');
const 4D = scanrange.createTextFinder('4D');
4D.replaceAllWith('4 ]D[ 4');
const xy = scanrange.createTextFinder('xy');
4D.replaceAllWith('xy's replacement');
}

此外,如果有任何关于这类主题的初学者指南,请告诉我,因为当涉及到脚本编码的逻辑和操作顺序时,我仍然是一个简单的初学者

谢谢!!

奖金问题:有没有一种方法可以使其在细胞是"细胞"的情况下;粗体"/例如,在其他形式的样式中,它会在单元格的粗体字符周围放置一个"3B";将变成";3]B["而不是"3B&"<=这将是这个更换过程的最终游戏,使我不得不列出更少的交换机,但如果这太复杂,那就不用担心了。

我相信你的目标如下。

  • 您希望降低脚本的处理成本
  • 在你的情况下,你想用大约40种模式来替换文本

修改点:

  • 我认为const 1A =const 2B =等变量不能使用。请小心
  • 关于4D.replaceAllWith('xy's replacement');,在这种情况下,xy's replacement不包含在内。请小心
  • 关于2B..replaceAllWith('2 B');..不正确
  • 为了降低脚本的处理成本,在这个答案中,我建议使用Sheetsneneneba API。当使用Sheets API时,可以通过一个API调用将文本替换为大约40个图案。由此,我认为工艺成本将能够降低

当以上几点反映到您的脚本中时,它变成如下。

修改的脚本:

在使用此脚本之前,请在高级Google服务中启用Sheets 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" }
];
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,在这种情况下,我认为可能需要使用上述修改中的其他过程。所以在这种情况下,我建议将其作为新问题发布

参考文献:

  • 方法:spreadsheets.batchUpdate of Sheets API
  • FindReplaceRequest

添加:

根据您的以下回复,

这是一个很棒的解决方案,然而,由于这是一种我需要能够让人们快速理解和使用的脚本,有没有任何方法可以在不激活高级工作表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));
}

最新更新