【问题标题】:Google Scripts - Can't get a result out of the while loopGoogle Scripts - 无法从 while 循环中获得结果
【发布时间】:2020-07-22 07:39:46
【问题描述】:

我无法从 while 循环中获取更新的结果。 已经花了几天时间阅读文章并试图弄清楚...... 希望你能帮忙:)

我想取一个标题(字符串),如果它的长度小于 78,我想随机添加单词, 使用工作表中的单词列表。 这工作得很好,问题是它一遍又一遍地添加相同的单词。 我搜索了一种删除重复项的方法,并找到了 [...new Set(arr)],并且效果很好。 然而,当我尝试在 while 循环中使用它时(每个循环检查删除重复项),最终结果仍然有重复项。

我正在添加可以帮助您更好地理解它的工作表, 床单 这是代码。

/**
* Adds Brand, adds words to 80 letters.
* 
* @Param Title the base title used
* @Param Brand the store brand (Ess,Eag..)
* @customfunction
*/

function AddKeyWords(title, brand) {
  
  title = ChangeTitleWords(title, brand); //previous function.
  //title = "Just a few words";
  if(title == "Missing Brand" || title == "") {
   return "Missing Brand or Title"; 
  } else {
    let wordsArr = title.split(" "); //split title to array
    let len = title.length; 
    
    //If title is more than 80 notes, remove words of it.
    while (wordsArr.join(" ").length > 80) {
      wordsArr.pop();
    }
    
    let Title2 = wordsArr.join(" ");
    let Title2Len = Title2.length;
    let len2 = 80 - Title2Len;
    
    //if title had less than 78 notes, add a random word
    while (len2 > 3) {
      let wordsArr1 = title.split(" ");
      
      if (len2 == 3) {
        wordsArr.push(random3());
      } else if (len2 == 4) {
        wordsArr.push(random4());
      } else if (len2 >= 5 && len2 < 18) {
        wordsArr.push(random5());
      } else if (len2 >= 18) {
        wordsArr.push(random10());
      }
      
      wordsArr = [...new Set(wordsArr)]; // create a new arr without duplicates
      len2 = 80 - wordsArr.join(" ").length;
      //return title3;
      
      title3 = wordsArr;
    }
    
    return title3.join(" ");

  }
}
   



////Random Functions.
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;      
}     
function random3() {
  var t = SpreadsheetApp.getActive().getSheetByName('Settings').getRange('L5:L').getValues().filter(String)
  return(t[getRandomInt(0, t.length-1)]);
} 
function random4() {
  var t = SpreadsheetApp.getActive().getSheetByName('Settings').getRange('M5:M').getValues().filter(String)
  return(t[getRandomInt(0, t.length-1)]);
} 
function random5() {
  var t = SpreadsheetApp.getActive().getSheetByName('Settings').getRange('N5:N').getValues().filter(String)
  return(t[getRandomInt(0, t.length-1)]);
} 
function random10() {
  var t = SpreadsheetApp.getActive().getSheetByName('Settings').getRange('O5:O').getValues().filter(String)
  return(t[getRandomInt(0, t.length-1)]);
} 

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets


    【解决方案1】:

    您的代码的问题是您将一个数组推入一个数组,而[...new Set()] 不适用于嵌套数组

    你可以很容易地看到实现日志的问题:

          Logger.log("before: ");
          Logger.log( wordsArr);
          wordsArr = [...new Set(wordsArr)];
          Logger.log("after: ");
          Logger.log( wordsArr);
    

    结果将是:

    Jul 22, 2020, 1:51:06 PM    Info    before: 
    Jul 22, 2020, 1:51:06 PM    Info    [Just, a, few, words, [ggggggggggg], [ggggggggggg]]
    Jul 22, 2020, 1:51:06 PM    Info    after: 
    Jul 22, 2020, 1:51:06 PM    Info    [Just, a, few, words, [ggggggggggg], [ggggggggggg]]
    

    请注意,如果您实施,您将不会看到相同的结果 Logger.log("after: " + wordsArr); 因为串联会转换 数组自动变成字符串。

    解决方案

    • 有很多方法可以将您的数组转换为一维字符串。

    • 在不修改其余代码的情况下,最简单的方法可能是使用flat()

    为此只需修改

    wordsArr = [...new Set(wordsAr))];

    wordsArr = [...new Set(wordsArr.flat())];

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 2020-04-28
      • 2014-06-20
      • 2021-09-25
      • 2014-02-14
      • 2012-04-14
      • 2014-12-05
      • 2019-04-21
      • 2015-12-28
      相关资源
      最近更新 更多