如何在 Google 脚本中提取项目属性?

问题描述 投票:0回答:2

我目前正在开发一个 Google 脚本,当相关电子表格中的项目被标记为完成时,该脚本会向指定用户发送电子邮件。

第一个函数在编辑电子表格时触发,并检查第 5 列,如果匹配则移动该行。第一个 If 语句检查第 5 列,查看它是否与“Completed”匹配,如果匹配,则将其移至“COMPLETED”表。我能够成功地向所需的用户发送电子邮件,但我也尝试在电子邮件中包含所选行的第一列。

这导致我尝试使用项目属性,因为全局变量在 Google 脚本中是不可能的。但是,当尝试提取测试属性时,它会破坏脚本。

有谁知道我如何更正我的代码,以便能够将 A 列推送到一个函数中的项目属性并将其拉入一个单独的函数中?

使用项目属性的最初想法取自以下线程:如何在 Google Apps 脚本中定义全局变量

谢谢!

function onEditTrigger(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange()

  // Below sends a completed project from the IN PROGRESS sheet to the COMPLETED sheet
  if(s.getName() == "IN PROGRESS" && r.getColumn() == 5 && r.getValue() == "Completed") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("COMPLETED");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
    // Send an email when a project is marked complete
    sendEmail();  
  }
    // Below sends a completed project from the COMPLETED sheet to the IN PROGRESS sheet
   if(s.getName() == "COMPLETED" && r.getColumn() == 5 && (r.getValue() == "In Development" || r.getValue() == "On Hold" || r.getValue() == "Delayed")) {
    var row2 = r.getRow();
    var numColumns2 = s.getLastColumn();
    var targetSheet2 = ss.getSheetByName("IN PROGRESS");
    var target2 = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1);
    s.getRange(row2, 1, 1, numColumns2).moveTo(target2);
    s.deleteRow(row2); 
  }
}
// Code that establishes desired emails, subject
function sendEmail() {
  var project = PropertiesService.getScriptProperties().getProperty('project');
  var subject = "Learning Solutions project has been completed: " + project;
  var emailAddress = "[email protected]";
  MailApp.sendEmail(emailAddress,subject,"This is a test"
    );
}

Screenshot of the current setup for Project Properties

google-sheets google-apps-script triggers
2个回答
0
投票

Google Apps 脚本支持全局变量,请参阅

Code.gs
这个简单示例:

var myGlobalVar = 'This is global var value';

function myFunction()
{
  Logger.log(myGlobalVar);
}

运行函数

myFunction
,然后从脚本编辑器菜单中选择查看 - 日志,您将看到

[17-07-06 00:12:58:691 EEST] 这是全局变量值


0
投票

我在调整后附加了代码,该代码允许我根据移动到已完成工作表的行的第一项动态填写要发送的电子邮件的主题。

            function onEditTrigger(event) {
              // assumes source data in sheet named Needed
              // target sheet of move to named Acquired
              // test column with yes/no is col 4 or D
              var ss = SpreadsheetApp.getActiveSpreadsheet();
              var s = event.source.getActiveSheet();
              var r = event.source.getActiveRange()

              // Below sends a completed project from the IN PROGRESS sheet to the COMPLETED sheet
              if(s.getName() == "IN PROGRESS" && r.getColumn() == 5 && r.getValue() == "Completed") {
                var row = r.getRow();
                var numColumns = s.getLastColumn();
                var targetSheet = ss.getSheetByName("COMPLETED");
                var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
                //Added below code to pull the first value of the current row and map it to an object in the project properties
                var project = s.getRange(row, 1,row,1).getDisplayValue();
                PropertiesService.getScriptProperties().setProperty('project', project);
                s.getRange(row, 1, 1, numColumns).moveTo(target);
                s.deleteRow(row);
                // Send an email when a project is marked complete
                sendEmail();  
              }
                // Below sends a completed project from the COMPLETED sheet to the IN PROGRESS sheet
               if(s.getName() == "COMPLETED" && r.getColumn() == 5 && (r.getValue() == "In Development" || r.getValue() == "On Hold" || r.getValue() == "Delayed")) {
                var row2 = r.getRow();
                var numColumns2 = s.getLastColumn();
                var targetSheet2 = ss.getSheetByName("IN PROGRESS");
                var target2 = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1);
                s.getRange(row2, 1, 1, numColumns2).moveTo(target2);
                s.deleteRow(row2); 
              }
            }
            // Code that establishes desired emails, subject
            function sendEmail() {
           //pulls down the 'project' property established earlier in the previous function and sets it as a variable in the new function              
              var project = PropertiesService.getScriptProperties().getProperty('project');
              var subject = "Learning Solutions project has been completed: " + project;
              var emailAddress = "[email protected]";
              MailApp.sendEmail(emailAddress,subject,"This is a test"
                );
            }
© www.soinside.com 2019 - 2024. All rights reserved.