谷歌脚本中包含字符串的动态变量名称

时间:2018-01-17 02:07:20

标签: javascript arrays for-loop google-apps-script foreach

目前,我有两个功能可以执行相同的操作,一次是针对我(让我们说H),一次针对我的妻子(W)。

该功能的作用如下:选择正确的电子表格,然后在电子表格中获取一些值以定义1 / a问题; 2 /一条消息和3 / a主题。稍后我会发一封电子邮件。

以下是H的代码(变量row和loopsize之前已经定义过):

  ss.setActiveSheet(ss.getSheetByName("question_H"));
  var sheet_H = SpreadsheetApp.getActiveSheet();

  var question_H = sheet_H.getRange(row,6).getDisplayValue();

  var message_H = "";


  for (var i=1; i<=loopsize; i++) {
     var year = Number(startyear)+i;
     var answer = sheet_H.getRange(row,7+i).getDisplayValue();
    message_H=message_H 
    + year + ':' + '\n'
    + answer + '\n\n';
  }

  var subject_H = question_H;

我想知道我是否可以创建一个循环,这样我就不必用H和W两次编写相同的代码。经过一些研究后我想出了以下内容(这不是相同的代码,但只是说明了我发现的解决方案:

 var names = ["H","S"];

  var message_H = "";
  var subject_H = ""; 

  var message_W = "";
  var subject_W = ""; 

  for each (var name in names){

  eval("message_"+[name] + " = "  + "'"+ name + "'")  ; 
  eval("subject_"+[name] + " = "  + "'"+ name + "'")  ;   


   }

但是我觉得使用eval非常麻烦。有没有更简单的方法呢?

感谢您的帮助。

=============================== EDIT =============== =======================

以下是我根据库珀的建议提出的建议。它现在正在工作,虽然我必须使用eval一次,这有点令人失望。

此外,任何人都可以解释为什么必须在函数getQA而不是mainQA中定义变量row,startyear和loopsize?我想如果它们在mainQA中定义,那么它们可以在getQA中使用,因为getQA是从mainQA调用的。那是错的吗?

function mainQA() {


  getQA("h");
  getQA("w");

}


function getQA(type){
  var p=type;

  var ss=SpreadsheetApp.getActive();
  var help_sheet=ss.getSheetByName("help");

  var row = help_sheet.getRange(3,2).getDisplayValue(); 
  var startyear = help_sheet.getRange(4,2).getDisplayValue();
  var loopsize = help_sheet.getRange(5,2).getDisplayValue();

  var email_w = 'wife@gmail.com';
  var email_h = 'husband@gmail.com';

  var email = eval("email_"+p);


  var sh=ss.getSheetByName('question_' + p);

  var question = sh.getRange(row,6).getDisplayValue();

  var message = "";

  for (var i=1; i<=loopsize; i++) {
     var year = Number(startyear)+i;
     var answer = sh.getRange(row,7+i).getDisplayValue();
    message=message 
    + year + ':' + '\n'
    + answer + '\n\n';
  }

  var subject = 'Q&A: ' + question;
  message = message 
  +  'What is your answer for today? \n'
  +'link to a google form';


  MailApp.sendEmail(email,subject, message);

}

2 个答案:

答案 0 :(得分:1)

//您可以使用参数创建函数。如果您不提供'W',则默认为'H';

function getQMS(type){
  var p=type||'H';
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('sheet_' + p);
  var row={'H':1,'W':2}; //whatever you want
  var col={'H':1,'W':2}; //again whatever you want
  var q=sh.getRange(row[p],col[p]).getValue();
  var m='';//not defined
  var s='';//not defined
  var QMS={Question:q,Message:m,Subject:s};
  return QMS;
}

答案 1 :(得分:1)

我一直在努力寻找要在Google表格脚本中使用的答案,并且找到了一个简单的解决方案:

function SetVar() {
  var VarName = [];

  for (var x = 0; x < 5; x++) {
      VarName[x] = x; //or any other value
  }

  Browser.msgBox(VarName[1])
  Browser.msgBox(VarName[2])
  Browser.msgBox(VarName[3])
  Browser.msgBox(VarName[4])
  Browser.msgBox(VarName[5])
}

注释

  1. 您将能够命名变量(带有数字)并将其用于许多用途。

  2. 对于我来说,我已经设置了一个常规变量,并使用split命令来获取要使用的VarName[x]的确切位置(数字)。