Как перенести значения из определенных столбцов в Google form, [игнорировать значения с пустыми значениями] в часть email HTMLBody с помощью GAS?

#javascript #google-apps-script

#javascript #google-apps-script

Вопрос:

Уважаемые полезные участники, я пытаюсь извлечь значения из определенных столбцов (от столбца D до I, как показано на скриншоте ниже)) из таблицы ответов. введите описание изображения здесь

Для каждой отправки формы Google мне нужно получить эти значения из Stocktake Item1 до пункта 6, перенести их так, чтобы значения отображались в HTMLBody электронного письма, как показано на скриншоте ниже :- введите описание изображения здесь

Эти элементы инвентаризации с нулевыми значениями отображаться не должны. Таким образом, каждая запись может иметь разные значения для каждого элемента инвентаризации, но должны отображаться только те, у которых нет пробелов или ненулевых значений.

Есть ли способ добиться этого?

На данный момент я могу достичь цели только при отображении их всех, независимо от нулей или нет. Способ, которым я делаю это в данный момент, заключается в создании таблицы в другом gsheet, а затем с помощью script скопировать значения из каждого столбца элемента инвентаризации в листе ответов в эту таблицу соответственно. Затем я создал html-шаблон для преобразования этой таблицы в html. Пожалуйста, обратитесь к скриншоту моей текущей таблицы в таблице «инвентаризация» ниже. введите описание изображения здесь

Мой текущий код выглядит следующим образом:-

 function gsheet2html() {
  const respsheet=SpreadsheetApp.openById("1c0-vzYQA_9KVHuGHKiYS-3iBBGhTg3EcCZBm7rZDIpM").getSheetByName('response');//input from gform
  const stocksheet=SpreadsheetApp.openById("1c0-vzYQA_9KVHuGHKiYS-3iBBGhTg3EcCZBm7rZDIpM").getSheetByName('stocktake'); //template
  
  const lrow=respsheet.getLastRow();
  const lr=stocksheet.getLastRow();
  var stockdate=respsheet.getRange(lrow,11).getValue();
  
  for(var i=4;i<lr-1;i  ){
  stocksheet.getRange(i,2).setValue(respsheet.getRange(lrow,i).getValue());
  stocksheet.getRange(i,3).setValue(stockdate); 
  }
   
  const headers=stocksheet.getRange("A3:C3").getValues();
  const descr=headers[0][0];
  const qty=headers[0][1];
  const date=headers[0][2];
 
  const tableRangeValues=stocksheet.getRange(2,1,lr-2,3).getDisplayValues();
  const total=stocksheet.getRange(lr,1,1,2).getDisplayValues();
  const totalText=total[0][0];
  const totalSum=total[0][1];
  
  const htmlTemplate=HtmlService.createTemplateFromFile("report");
  htmlTemplate.descr=descr;
  htmlTemplate.qty=qty;
  htmlTemplate.date=date;
  htmlTemplate.stockdate=stockdate;
  htmlTemplate.totalText=totalText;
  htmlTemplate.totalSum=totalSum;
  htmlTemplate.tableRangeValues=tableRangeValues;
  
  const htmlForEmail=htmlTemplate.evaluate().getContent();
  console.log(htmlForEmail);
  
  MailApp.sendEmail(
    "testesttest@gmail.com",
    "Your Monthly Report",
    "Please open this email with HTML support",
    {htmlBody:htmlForEmail}
  );
}

  

Мой HTML-код для тела электронного письма (html-файл: ‘report’) в настоящее время выглядит следующим образом:

 <!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
 <br>Dear Mr. PIC,
 <br>
 <br>Stocktake for today for your kind perusal.
 <br>
 <br>
  <div style="background-color:purple;height:4px;"></div>
  
<table>
<thead>
<tr style="text-align:center;padding:6px;color:purple;font-size:16px;">
<th ><?=descr?></th><th><?=qty?></th><th><?=date?></th>
</tr>
</thead>
<tbody>

<?tableRangeValues.forEach((r,i)=>{
let color;
if(i%2===0){color="light-grey"} else{color="white"}?>
<tr style="background-color:<?=color?>;">
<td style="text-align:left;padding:6px;"><?=r[0]?></td>
<td style="text-align:right;padding:6px;"><?=r[1]?></td>
<td style="text-align:center;padding:6px;"><?=r[2]?></td>
</tr>
<?})?>

</tbody>
<tfoot>
<tr style="color:purple; font-size:16px;font-weight:bold;">
<td style="text-align:left;"><?=totalText?></td><td style="text-align:right;"><?=totalSum?></td>
</tr>
</tfoot>
</table>
<br>
<br>Thank you.
<br>
<br>Yours Sincerely,
<br>Somebody@Work
</body>
</html>
  

Но с помощью этого метода все элементы Stocktake фиксируются, поэтому каждый раз, когда я создавал html-электронное письмо, в нем всегда будет отображаться весь элемент Socktake в соответствии с таблицей. Мне поручено опустить элементы с нулевыми значениями. Пока я не могу использовать эту фиксированную таблицу для динамического исключения этих элементов с нулевыми значениями. Я думаю, теоретически это должно быть как-то путем извлечения значений непосредственно из листа ответов, проверки этих ненулевых значений только для того, чтобы они были в массиве, транспонировать их в html-шаблон. Но я просто не знаю, как это закодировать. Я нашел только GAS, который показывает, что нужно перенести все значения из листа ответов, а не только выборочные.

Надеюсь, на этот раз моя постановка проблемы более ясна, и, надеюсь, у кого-нибудь может быть решение для этого. Заранее благодарю вас.

Комментарии:

1. К сожалению, из вашего вопроса я не могу понять взаимосвязь между <td><?=row[0]?></td><td><?=row[1]?><?=row[2]?></td><td><?=row[3]?></td> и вашим ожидаемым результатом. Я прошу прощения за мое плохое понимание. Можете ли вы предоставить примерные значения tableRangeValues ?

2. Извините за мое плохое объяснение. Довольно сложно объяснить мою проблему словами, чем показывать напрямую. Однако позвольте мне попытаться перефразировать содержание моего вопроса выше.

3. Спасибо за ответ. Кажется, что в вашем скрипте tableRangeValues создается таблица. Итак, я подумал, что когда будет предоставлено примерное значение tableRangeValues , это также поможет подумать о решении. И я подумал, что предварительная обработка значения tableRangeValues может подойти для достижения вашей цели. Как насчет этого?

4. Добро пожаловать,@Tanaike. Я только что закончил отредактированную версию своего вопроса. я надеюсь, что это проясняет лучше.

5. Спасибо за ответ и добавление дополнительной информации. К сожалению, из I only can achieve the goal on displaying them all regardless zeros or not. я не могу представить ваш текущий скрипт для извлечения значений из электронной таблицы. Это связано с моим плохим знанием английского языка. Я должен извиниться за это. Из-за этого я не могу представить значение tableRangeValues . Чтобы правильно понять вашу текущую ситуацию и вашу цель, можете ли вы предоставить свой текущий скрипт? А также, можете ли вы предоставить примерное значение tableRangeValues ?

Ответ №1:

Точки модификации:

Когда stockdate лист имеет значения «A3: C10», как ваше 3-е изображение, в вашем скрипте, tableRangeValues это значения из «A2: C9», которые stocksheet.getRange(2,1,lr-2,3).getDisplayValues() . Таким образом, когда я увидел ваше 3-е изображение, пустая строка и строка заголовка были включены в tableRangeValues . Поэтому я думаю, что ваш сценарий может отличаться от вашей реальной ситуации. Я беспокоюсь об этом.

Таким образом, предполагается, что в вашей реальной ситуации tableRangeValues следующие значения,

 Stock Item1       9/20/2020
Stock Item2       9/20/2020
Stock Item3   6   9/20/2020
Stock Item4       9/20/2020
Stock Item5   7   9/20/2020
Stock Item6   8   9/20/2020
  

как насчет следующей модификации?

От:

 htmlTemplate.tableRangeValues=tableRangeValues;
  

Для:

 htmlTemplate.tableRangeValues = tableRangeValues.filter(([,b]) => b.toString() != "");
  

или

 htmlTemplate.tableRangeValues = tableRangeValues.filter(function(e) {return e[1].toString() != ""});
  

Примечание:

  • Если ваша фактическая ситуация такая же с вашим 3-м изображением и используется этот модифицированный скрипт, а 2 строки заголовка отображаются в HTML, пожалуйста, измените следующим образом и протестируйте его снова. В этой модификации значения извлекаются из A4:C9 .

    • От

         const tableRangeValues=stocksheet.getRange(2,1,lr-2,3).getDisplayValues();
        
    • Для

         const tableRangeValues=stocksheet.getRange(4,1,lr-4,3).getDisplayValues();
        

Ссылка:

Комментарии:

1. Спасибо за ваш быстрый ответ, @Tanaike. Я попробую это сейчас и скоро обновлю вас.

2. спасибо за ваше решение и исправления! Я не понял, что неправильные ссылки, поскольку я не понял, что это привело к тому, что заголовки были дважды «напечатаны», и я не думал, что смогу использовать шаблон gsheet ‘stocksheet’ для достижения этого! БОЛЬШОЕ спасибо,@Tanaike!! Вы спасли положение!