82407


**やりたいこと**  
GASを使用してGSSの中身を取得してdiscordの複数のチャンネルにメッセージを送りたいと考えています。  
for文でうまく回そうと考えたのですが、うまくいかず次のコードだとすべてのチャンネルに同じ出力になります。  
どのようにすればそれぞれ違う値を送信することができるでしょうか？

**試したこと**  
for文を使って 変数i,jの値を一つずつ増やして、セルを一つずつずらそうとした。

[code]

    function submit(){
      discord(get_value())
    };
    
    function get_value() {
      var sheet = get_sheet('https://docs.google.com/spreadsheets/xxxxxxxxxxxx/xxxxxxxx/xxxxxxx',0);
      //日付
    
      var datecoord = sheet.getRange(2,3);
      var date = datecoord.getValue();
      //format
      var formatcoord = sheet.getRange(3, 3);
      var format = formatcoord.getValue();
    
      //配信時間
      for (let i = 11; i <= 15; i++) {
        var timecoord = sheet.getRange(i,6); 
        var haisintime = timecoord.getValue();
      
        var message = Function('var date = ' + date + '; var haisintime = ' + haisintime + '; return ' + format + ';')();
      
        return message;
      }
      
    };
    
    //googleスプレットシート  自動送信
    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_sheet('https://docs.google.com/spreadsheets/yyyyyyyy/yyyyyy/yyyyyyy',0);
        for (let j = 2; j <= 6; j++) {
          //webhook
          var webhookcoord = sheet2.getRange(j,8);
          var webhook = webhookcoord.getValue();
    
        //token
          var tokencoord = sheet2.getRange(j,9);
          var dtoken = tokencoord.getValue();
    
      　//channel
          var channelcoord = sheet2.getRange(j,7);
          var dchannel = channelcoord.getValue();
    
        //format
          const url        = webhook;
          const token      = dtoken;
          const channel    = dchannel;
          const text       = message;
          const username   = 'Spidey Bot';
          const parse      = 'full';
          const method     = 'post';
    
          const payload = {
              'token'      : token,
              'channel'    : channel,
              "content"    : text,
              'username'   : username,
              'parse'      : parse,
          };
    
          const params = {
              'method' : method,
              'payload' : payload,
              'muteHttpExceptions': true
    
          };
    
        response = UrlFetchApp.fetch(url, params);
        }
        
    }
    
[/code]

**追加コード**  
get_value関数のみ

[code]

    function get_value() {
      var sheet = get_sheet('https://docs.google.com/spreadsheets/xxxxxx/xxxxxxx/xxxx',0);
      for (let i = 11; i <= 15; i++) {
        //日付
        var datecoord = sheet.getRange(2,3);
        var date = datecoord.getValue();
          //format
        var formatcoord = sheet.getRange(3, 3);
        var format = formatcoord.getValue();
    
        
        //配信時間
        const range = sheet.getRange(11, 6, 5); 
    
        /*
        var timecoord = sheet.getRange(i,6); 
        var haisintime = timecoord.getValue();
         */ 
        var message = Function('var date = ' + date + '; var haisintime = ' + haisintime + '; return ' + format + ';')();
      }
      return message;
    
[/code]

**追加質問**  
変数haisintimeが0であったとき、そのチャンネルには送信しないようにしたいと考えています。  
get_value()の配信時間のところでhaisintimeをif、elseで0である場合は  
Noneとして、discord()で送らないメッセージを飛ばそうとしたのですがどうもうまくいきません。  
アドバイスを頂けるとありがたいです。

[code]

    function submit(){
      discord()
    };
    
    function get_value() {
      var sheet1 = get_sheet('https://docs.google.com/spreadsheets/xxxxxxx/xxxxx/xxxxxx',0);
        
        var datecoord = sheet1.getRange(2,3);
        var date = datecoord.getValue();
          //format
        var formatcoord = sheet1.getRange(3, 3);
        var format = formatcoord.getValue();
    
        
        //配信時間
        var messages_array = []; // initialize
        //var lastRow = sheet1.getLastRow()-10;
        //console.log(lastRow);
      for (let i = 11; i <= 16; i++) {
        var timecoord = sheet1.getRange(i,6); 
        var haisintime = timecoord.getValue();
        if (haisintime == 0) {
          var message = 'None'
          } else {
          var message = Function('var date = ' + date + '; var haisintime = ' + haisintime + '; return ' + format + ';')();
        }
        messages_array.push(message); // push
      }
      return messages_array; // return
        
      
    };
    
    
    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/yyyyy/yyyy/yyyyy',0);
    
        var messages = get_value();  // call get_value() at here
    
        var lastRow2 = sheet2.getLastRow();  //最終行取得
        
        for (let j = 2; j <= lastRow2; j++) {
          //webhook
          var webhookcoord = sheet2.getRange(j,2);
          var webhook = webhookcoord.getValue();
    
        //token
          var tokencoord = sheet2.getRange(j,3);
          var dtoken = tokencoord.getValue();
    
      　//channel
          var channelcoord = sheet2.getRange(j,1);
          var dchannel = channelcoord.getValue();
    
        //format
          const url        = webhook;
          const token      = dtoken;
          const channel    = dchannel;
          const textdata       = messages[j-2];
          if (textdata == 'None') {
            continue;
          }
          else {
            const text = testdata;
          }
          
          const username   = 'Spidey Bot';
          const parse      = 'full';
          const method     = 'post';
    
          const payload = {
              'token'      : token,
              'channel'    : channel,
              "content"    : text,
              'username'   : username,
              'parse'      : parse,
          };
    
          const params = {
              'method' : method,
              'payload' : payload,
              'muteHttpExceptions': true
    
          };
    
        response = UrlFetchApp.fetch(url, params);
        }
        
    }
    
[/code]


CC BY-SA 4.0
2021-09-10T07:03:54.093
82403
2021-09-12T04:20:45.743
2021-09-12T03:45:03.023
47546
47546
question
google-apps-script google-spreadsheet
GASでGSSの内容を取得して複数のdiscordチャンネルに送信したいが、値が変わらない


#### 追加質問に対する回答

推測になりますが、`get_value()` 内の for loop の内部で `var message = ...` としているために、変数
`message` のスコープが `if` 文の内側に限定されているのではないかと思います。なので、以下の様に変更します。ここで、`haisintime`
が `0` の場合には `None` という文字列ではなく空文字列(`''`)がセットされる事になります(もちろん、`None`
をセットしても構いません)。

[code]

        //配信時間
        var messages_array = []; // initialize
        //var lastRow = sheet1.getLastRow()-10;
        //console.log(lastRow);
      for (let i = 11; i <= 16; i++) {
        var timecoord = sheet1.getRange(i,6); 
        var haisintime = timecoord.getValue();
        var message = '';
        if (haisintime > 0) {
          message = Function('var date = ' + date + '; var haisintime = ' + haisintime + '; return ' + format + ';')();
        }
        messages_array.push(message); // push
      }
    
[/code]

次に `discord()` ですが、early return に変更します。

[code]

    function discord(message) {
                         :
    
        var sheet2 = get_sheet2('https://docs.google.com/spreadsheets/yyyyy/yyyy/yyyyy',0);
        for (let j = 2; j <= lastRow2; j++) {
          // skip when message is empty
          const textdata = messages[j-2];
          if (textdata === '') {
            continue;
          }
    
          //webhook
          var webhookcoord = sheet2.getRange(j,2);
          var webhook = webhookcoord.getValue();
                       :
    
          const payload = {
              'token'      : token,
              'channel'    : channel,
              "content"    : textdata, // textdata is not empty
              'username'   : username,
              'parse'      : parse,
          };
    
[/code]

#### 当初の質問に対する回答

変更部分は `submit()` と `get_value()` と `discord()` になります。

  * `discord()` 内で `get_value()` を呼び出す
  * `get_value()` はメッセージの配列を返す
  * `discord()` 内の for loop でメッセージをセット、インデックスの差異を調整

> GASは初心者ですので具体的にどのようなコードであればできるか

私も GAS でプログラムを書いたことはありませんので、推測で変更しました。動作確認はしていませんので想定通りに動作しない場合にはそちらで修正して下さい。

[code]

    function submit(){
      discord()
    };
    
    function get_value() {
      var sheet = get_sheet('https://docs.google.com/spreadsheets/xxxxxxxxxxxx/xxxxxxxx/xxxxxxx',0);
      //日付
    
      var datecoord = sheet.getRange(2,3);
      var date = datecoord.getValue();
      //format
      var formatcoord = sheet.getRange(3, 3);
      var format = formatcoord.getValue();
    
      //配信時間
      var messages_array = []; // initialize
      for (let i = 11; i <= 15; i++) {
        var timecoord = sheet.getRange(i,6); 
        var haisintime = timecoord.getValue();
      
        var message = Function('var date = ' + date + '; var haisintime = ' + haisintime + '; return ' + format + ';')();
     
        messages_array.push(message); // push
      }
     
      return messages_array; // return
    };
    
    function discord() {
        var sheet2 = get_sheet('https://docs.google.com/spreadsheets/yyyyyyyy/yyyyyy/yyyyyyy',0);
    
        var messages = get_value();  // call get_value() at here
    
        for (let j = 2; j <= 6; j++) {
          //webhook
          var webhookcoord = sheet2.getRange(j,8);
          var webhook = webhookcoord.getValue();
    
        //token
          var tokencoord = sheet2.getRange(j,9);
          var dtoken = tokencoord.getValue();
    
        //channel
          var channelcoord = sheet2.getRange(j,7);
          var dchannel = channelcoord.getValue();
    
        //format
          const url        = webhook;
          const token      = dtoken;
          const channel    = dchannel;
          const text       = messages[j-2]; // offset value equals to 2
          const username   = 'Spidey Bot';
          const parse      = 'full';
          const method     = 'post';
    
          const payload = {
              'token'      : token,
              'channel'    : channel,
              "content"    : text,
              'username'   : username,
              'parse'      : parse,
          };
    
          const params = {
              'method' : method,
              'payload' : payload,
              'muteHttpExceptions': true
          };
    
        response = UrlFetchApp.fetch(url, params);
        }
    }
    
[/code]


CC BY-SA 4.0
2021-09-10T15:43:03.420
82407
2021-09-12T04:20:45.743
2021-09-12T04:20:45.743
47127
47127
82403
answer