如何解决在一个范围内查找和替换多个单元格字符串的最有效方法是什么? 修改点:修改后的脚本:注意:参考:
**背景**
- 我正在编写用于在格斗游戏中进行组合的代码
- 我需要取一个范围,然后将某些数字和/或字母转换为其他数字/和/或带有附加字符/间距的字母,以便程序注册组合。
现在我有一些代码可以完成工作,但我不认为这是“正确”或有效的方法,因为总共将设置大约 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[" 而不是 "3 B"
解决方法
我相信你的目标如下。
- 您希望降低脚本的流程成本。
- 在您的情况下,您想用大约 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: "xy's replacement" }
];
replacePatterns.forEach(({ search,replace }) => scanrange.createTextFinder(search).replaceAllWith(replace));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。