在特定时间出现后,如何用特定值替换另一个值?

时间:2019-01-22 17:16:03

标签: google-sheets

基本上,我必须在Google表格上写一个公式,在该公式出现一次后,我可以用所有出现的某个数值替换为另一个数值。

例如,某个字符串说"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表格公式可以提供帮助?我的意思是,我是游戏设计师,而不是程序员,所以脚本和一些代码解决方案对我来说很难工作。

非常感谢您的关注。

2 个答案:

答案 0 :(得分:0)

您可以这样做:

="""Draw {"&C2&"} cards."""&CHAR(10)&
 """Deal {"&D2&"} damage to {"&E2&"} players."""&CHAR(10)&
 """Gain {"&F2&"} life and discard {"&G2&"} cards."""

1


或者您可以这样做:

="""Draw {"&D11&"} cards."""&CHAR(10)&
 """Deal {"&D11+1&"} damage to {"&D11+2&"} players."""&CHAR(10)&
 """Gain {"&D11+3&"} life and discard {"&D11+4&"} cards."""

enter image description here

答案 1 :(得分:0)

您可以对字符串进行正则表达式并替换它们。

以下脚本将字符串作为输入,然后仅替换所有出现的{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.log("Original String: " + string);
console.log("Changed String: " + changeString('Draw {0} cards.Deal {0} damage to {1} players.Gain {0} life and discard {1} cards.'));

主要概念来自有关堆栈溢出的其他文章,分别为thisthat