85589


**しようとしていること**  
GASを使用してdiscordに文章を送信しようと思っています。  
スプレットシートに書いたformat文に変数を交えて送信する形になっています。

**困っていること**  
BcolからZcolまでの変数を使用してformatに文章を作ろうと思っているのですが、  
同じ変数を二度使うと変数が表示されてしまいます。

例えば、

**賞金は20000円です。20000円のプレゼントです。**  
という文章を送るためにformat文に  
**" 賞金は" \+ Bcol + "円です。" \+ Bcol + "円のプレゼントです。"**  
という文章をformatとして記入すると、  
**賞金は20000円です。Bcol円のプレゼントです。**  
と表示されてしまうのです。どのようにすれば同じ変数が二度使われたとしてもうまくいくでしょうか？

[code]

    function submit(){
      discord()
    };
    
    function get_value() {
      var sheet1 = SpreadsheetApp.getActiveSheet();
    
      
    
      var [[date], [format]] = sheet1.getRange("C2:C3").getValues();
      format = format.replace(/[ 　"+]+/g, "").replace("date", date);
      
      var values = sheet1.getRange("A11:Z" + sheet1.getLastRow()).getValues();
      var messages_array = values
        .filter((r) => r[10] != 0) //取得した範囲の列で配列の数え方で入力する
        .map(
          ([channel, Bcol, Ccol, Dcol, Ecol, Fcol, Gcol, Hcol, Icol, Jcol, Kcol, Lcol, Mcol, Ncol, Ocol, Pcol, Qcol, Rcol, Scol, Tcol, Ucol, Vcol, Wcol, Xcol, Ycol, Zcol]) => {
            const message = Object.entries({
              Bcol,
              Ccol,
              Dcol,
              Ecol,
              Fcol,
              Gcol,
              Hcol,
              Icol,
              Jcol,
              Kcol,
              Lcol,
              Mcol,
              Ncol,
              Ocol,
              Pcol,
              Qcol,
              Rcol,
              Scol,
              Tcol,
              Ucol,
              Vcol,
              Wcol,
              Xcol,
              Ycol,
              Zcol
            }).reduce((s, e) => s.replace(...e).replace(/\\n/g, "\n"), format);
    
    
    
            return [channel, message];
          }
        );
    
      return new Map(messages_array);
    }
    
    
    function get_sheet(gss_url,sheet_num) {
      var ss = SpreadsheetApp.openByUrl(gss_url);
      var sheet = ss.getSheets()[sheet_num];
      return sheet;
    };
    
    
    function get_sheet2(gss_url,sheet_num) {
      var discord = SpreadsheetApp.openByUrl(gss_url);
      var sheet2 = discord.getSheets()[sheet_num];
      return sheet2;
    };
    
    function discord(message) {
        var sheet2 = get_sheet2('https://docs.google.com/spreadsheets/d/yyyyyyyyyyyyyyyy',0);
    
        var messages = get_value();  // call get_value() at here
    
        var lastRow2 = sheet2.getLastRow();  //最終行取得
        
        for (let j = 11; j <= lastRow2; j++) {
    
          //webhook
          var webhookcoord = sheet2.getRange(j,3);
          var webhook = webhookcoord.getValue();
    
        //token
          var tokencoord = sheet2.getRange(j,4);
          var dtoken = tokencoord.getValue();
          
      　//channel
          var channelcoord = sheet2.getRange(j,2);
          var dchannel = channelcoord.getValue();
          
        //format
          const url        = webhook;
          const token      = dtoken;
          const channel    = dchannel;
          const text = messages.get(channel);
          if (!text) {
            console.log(channel + " : 送信なし");
            continue;}
          
    
          
          
    
          const username   = 'bot';
          const avatar_url = "http://drive.google.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
          const parse      = 'full';
          const method     = 'post';
    
          const payload = {
              'token'      : token,
              'channel'    : channel,
              "content"    : text,
              'username'   : username,
              'parse'      : parse,
              'avatar_url' : avatar_url,
          };
    
          const params = {
              'method' : method,
              'payload' : payload,
              'muteHttpExceptions': true   
    
          };
          Utilities.sleep(800);
          
        response = UrlFetchApp.fetch(url, params);
        //実行ログ
        console.log(channel + " : " + text); 
    
    
        }
        
    }
    
    
    
    
[/code]

**補足１**  
文章は以下のスプレットシートのようにC3に直接記入する形になります。  
get_value()関数の  
var [[date], [format]] = sheet1.getRange("C2:C3").getValues();  
のformatに当たります。

また、A列やB列は空欄になっておりますが、個人的な情報が書かれているため、消しているだけで値はあります。

[![画像の説明をここに入力](https://i.stack.imgur.com/mVjje.png)](https://i.stack.imgur.com/mVjje.png)


CC BY-SA 4.0
2022-01-08T13:25:50.020
85568
2022-01-09T14:37:02.927
2022-01-09T04:34:42.693
47546
47546
question
google-apps-script
同じ変数を二度使用すると、二回目には変数の値ではなく変数の文字がそのまま表示されてしまう。


([こちら](https://ja.stackoverflow.com/q/84071/2808)
と関連する質問であることを明記しておくと他の方から見て経緯がわかりやすいと思います)

[`replace()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
の代わりに
[`replaceAll()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)
を利用することで期待する動作になると思います。

[code]

    const format = "賞金はBcol円です。Bcol円のプレゼントです。";
    
    console.log("replaceAll: " + format.replaceAll("Bcol", "20000"));
    console.log("replace: " + format.replace("Bcol", "20000"));
[/code]


CC BY-SA 4.0
2022-01-09T14:37:02.927
85589
2022-01-09T14:37:02.927
2808
85568
answer