Пусть «ссылка» будет строкой «(см. Пример n
)», где n
- это число.
Пусть «примером» будет «(n
) Пример текста ... "где n
- число, и это всегда начало строки.
Это решение предполагает, что вы вручную заказали свои« ссылки »и« примеры ». Код не меняет порядок списка примеров. Следовательно, не имеет значения, каковы текущие значения n
, нам просто нужно go через весь Do c и применить последовательные числа.
Это проще реализовать, если вы можете забыть все ваше форматирование при запуске обновления. В этом случае вы можете использовать обычный JavaScript и применить String.prototype.replace
ко всему телу. Однако я предполагаю, что вы не хотите удалять свое форматирование, поэтому мы вынуждены использовать вместо этого модель DocumentApp
.
В моем примере я использую body.findText
до l oop через Do c. К сожалению, здесь используются регулярные выражения строки вместо обычных объектов RegExp, которым для поиска буквальных скобок требуются дополнительные обратные косые черты. Кроме того, я использую текстовые функции deleteText
и insertText
, а не String.prototype.replace
, потому что использование replace
будет воздействовать на весь элемент, а не на начальное и конечное смещения, найденные функцией findText
.
function updateSequentialReferences() {
const body = DocumentApp.getActiveDocument().getBody();
replaceSequentially(body, "\\(see example \\d+\\)", count => `(see example ${count})`);
replaceSequentially(body, "^\\(\\d+\\)(.*)$", (count, match) => match.replace(/^\(\d+\)/, `(${count})`));
}
function replaceSequentially(body, regexString, replacerFn) {
let foundRef = body.findText(regexString);
let count = 1;
while (foundRef !== null) {
const {element, end, start} = unwrapRangeElement(foundRef);
const text = element.asText();
const match = text.getText().slice(start, end + 1);
text.deleteText(start, end);
text.insertText(start, replacerFn(count, match));
++count;
foundRef = body.findText(regexString, foundRef);
}
}
function unwrapRangeElement(element) {
return {
element: element.getElement(),
end: element.getEndOffsetInclusive(),
start: element.getStartOffset(),
}
}