По сути, я должен написать формулу в Google Sheets, где я могу заменить все вхождения определенного числа на другое после того, как оно уже появилось один раз.
Например, определенная строка говорит "Draw {0} cards."
Где {0}
— это число переменной, которое будет заменено другой строкой на более позднем этапе (значение, конкретное слово и т. д.).
Я должен объединить этот результат с другой конкретной строкой, которая говорит:
"Deal {0} damage."
Это должно выглядеть так: "Draw {0} cards. Deal {0} damage."
Однако система не содержит таких строк, поэтому формула должна изменить выражение на "Draw {0} cards. Deal {1} damage."
. Это означает, что всякий раз, когда число уже появилось в строке, его следующее вхождение должно быть заменено следующим.
Я знаю, что могу использовать такие формулы, как
=SUBSTITUTE(B27;"0";"1";2)
Где B27
— это ячейка, в которой я объединяю две предыдущие строки.
Основная проблема здесь в том, что обычно я не буду объединять только две разные строки. Иногда существует более 3 или 4 строк, и в большинстве случаев эти строки имеют свои собственные переменные в последовательности.
Например, если бы я объединил эти три разные строки, предыдущая формула не работала бы должным образом:
"Draw {0} cards."
"Deal {0} damage to {1} players."
"Gain {0} life and discard {1} cards."
Простое объединение этих строк приведет к:
"Draw {0} cards. Deal {0} damage to {1} players. Gain {0} life and discard {1} cards."
Но для того, чтобы это сработало, я должен получить такой результат:
"Draw {0} cards. Deal {1} damage to {2} players. Gain {3} life and discard {4} cards."
Может ли кто-нибудь здесь помочь мне с формулой, которая могла бы решить эту проблему? Есть ли какая-нибудь формула Google Sheets, которая может помочь? Я имею в виду, что я гейм-дизайнер, а не программист, поэтому мне немного сложнее работать со сценариями и некоторыми кодовыми решениями.
Спасибо вам большое за ваше внимание.
да. Точно. Независимо от начальных значений конечный результат всегда должен отображать последовательность {0}...{1}...{2}... и т. д.
вы можете сделать это так:
= """Draw {"&C2&"} cards."""&CHAR(10)&
"""Deal {"&D2&"} damage to {"&E2&"} players."""&CHAR(10)&
"""Gain {"&F2&"} life and discard {"&G2&"} cards."""
или вы можете сделать это так:
= """Draw {"&D11&"} cards."""&CHAR(10)&
"""Deal {"&D11+1&"} damage to {"&D11+2&"} players."""&CHAR(10)&
"""Gain {"&D11+3&"} life and discard {"&D11+4&"} cards."""
Спасибо, player0. Однако я не могу изменить существующие строки, потому что они взяты из ранее установленной базы данных. Максимум, что я могу изменить, — это формулы в ячейке, которая объединяет эти строки.
Вы можете регулярно использовать строки и заменять их.
Следующий сценарий принимает строку в качестве входных данных, а затем просто заменяет все вхождения {0}, {2}, {4} и т. д. и заменяет их правильными числами.
По сути, он использует регулярное выражение, чтобы определить, как часто встречается шаблон, а затем выполняет итерацию по строке и вносит изменения.
// String used for tests
var string = 'Draw {0} cards.Deal {0} damage to {1} players.Gain {0} life and discard {1} cards.'
// Actual function
function changeString(input){
var re = /({[0-9]{1,5}})/g;
var totalMatches = count(input);
// Internal function to count the occurrance of matches of {number} (up
to five digits inside brackets)
function count(input){
return ((input || '').match(re) || []).length
}
// Internal function to replace the n-th input and return a modified
string
function replaceNthElement(input, re, n, transform) {
let count = 0;
return input.replace(
re,
match => n(++count) ? transform(match) : match);
}
// Iterating over the string in order to change all occurrences of
{number}
for (var n = 0; n <= totalMatches; n++) {
input = replaceNthElement(input, re, count => count === n, sstr => '{' + (n-1) + '}');
}
return input;
};
// for demonstration only
console.info("Original String: " + string);
console.info("Changed String: " + changeString('Draw {0} cards.Deal {0} damage to {1} players.Gain {0} life and discard {1} cards.'));
Основные концепции взяты из других статей о переполнении стека, а именно это и тот.
Просто чтобы убедиться, что я правильно понимаю: «счетчик» увеличивается независимо от начального {значения} в скобках? Итак, "{0}..{2}..{2}..{3}..{2}..{12}" должно превратиться в "{0}..{1}..{2}.. {3}..{4}..{5}"?