首页 > 解决方案 > Google Script - 如何在修改范围内的单元格时生成模板?

问题描述

我希望每个人在那个时候都很好

发布此消息以获得对我正在开发的工具的一些帮助。我对此很陌生,我的问题可能是语法/简单的逻辑问题,因为我缺乏脚本基础

这是我想做的: 在此处输入图像描述

当 AC 列中的单元格被勾选(修改)时,我希望我的脚本生成一个模板,并用 AC 列中已修改的相应行中的数据 A、B、C 填充该模板

所以这里有3个步骤:

至于现在,我一直试图让 1 和 2 一起工作。如果我找不到任何解决方案,3 可能是另一个帖子

所以这里是 onEdit 函数的代码。这是工作。当我在 AC clumn 中勾选一个单元格时,我会收到“酷”警报。(我在 Stackoverflow 上找到了这个)

function onEdit() 

{
  var sheet = SpreadsheetApp.getActiveSheet();
  var editRange = sheet.getActiveRange();
  var editRow = editRange.getRow();
  var editCol = editRange.getColumn();
  var range = sheet.getRange("AC3:AC31");
  var rangeRowStart = range.getRow();
  var rangeRowEnd = rangeRowStart + range.getHeight();
  var rangeColStart = range.getColumn();
  var rangeColEnd = rangeColStart + range.getWidth();
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd){
        
       SpreadsheetApp.getUi().alert('COOL')

      }
}

这是 GenerateTemplate 的代码,它也可以正常工作

function GenerateTemplate() {

 var documentId = DriveApp.getFileById('XXXXXXXXXXXXXX').makeCopy().getId() ;

 DriveApp.getFileById(documentId).setName('CONTRACT_2021_V2');

 var body = DocumentApp.openById(documentId).getBody() ;
 
 var sheet = SpreadsheetApp.getActiveSheet() ;
 var range = sheet.getRange(3,5);
 var data = range.getValue() ;

 body.replaceText('##Nom##' , data) ;
}

我想做的是清楚地表达这两个功能。

我尝试了几种方法,但从未成功。在“if”语句之后,我尝试添加 GenerateTemplate 函数,但它似乎不起作用

function onEdit() 

{
  var sheet = SpreadsheetApp.getActiveSheet();
  var editRange = sheet.getActiveRange();
  var editRow = editRange.getRow();
  var editCol = editRange.getColumn();
  var range = sheet.getRange("AC3:AC31");
  var rangeRowStart = range.getRow();
  var rangeRowEnd = rangeRowStart + range.getHeight();
  var rangeColStart = range.getColumn();
  var rangeColEnd = rangeColStart + range.getWidth();
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd){
        
       GenerateTemplate()

      }
}

我还尝试将这两个功能放在同一页面上。但仍然没有成功:

function GenerateTemplate() {

 var documentId = DriveApp.getFileById('XXXXXXXXXXXXXXXXXXX').makeCopy().getId() ;

 DriveApp.getFileById(documentId).setName('CONTRACT_2021_V2');

 var body = DocumentApp.openById(documentId).getBody() ;
 
 var sheet = SpreadsheetApp.getActiveSheet() ;
 var range = sheet.getRange(3,5);
 var data = range.getValue() ;

 body.replaceText('##Nom##' , data) ;
}

function onEdit() 

{
  var sheet = SpreadsheetApp.getActiveSheet();
  var editRange = sheet.getActiveRange();
  var editRow = editRange.getRow();
  var editCol = editRange.getColumn();
  var range = sheet.getRange("AC3:AC31");
  var rangeRowStart = range.getRow();
  var rangeRowEnd = rangeRowStart + range.getHeight();
  var rangeColStart = range.getColumn();
  var rangeColEnd = rangeColStart + range.getWidth();
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd){
        
       GenerateTemplate()

      }
}

当我单击“执行”时,我的驱动器会使用正确命名的模板的新副本进行更新。但是当我在 AC 列中勾选一个单元格时,什么也没有发生。

如果有人可以帮助我使这两个功能一起工作,那就太好了

最好的,

标签: google-apps-scriptgoogle-sheets

解决方案


So, for other people, here is how it worked

Thx again to Milan and iansedano

Trigger can't launch access services that require authorization. My tool goes through DriveApp, which is why the trigger wasn't working.

Script is working. But, for the trigger to work, you need to install it, through the specific windows in google script.

Here are the pictures :

enter image description here

then, choose your function

Thx again ! Kind regards

enter image description here


推荐阅读