暂时禁用触发器

时间:2016-09-09 04:51:42

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

我的任务是使用Google表格在单元格内创建按钮。由于除了使用图像之外,GAS本身不允许按钮,因此我决定使用数据验证来完成工作。我创建了数据验证而不是带有单数条目的按钮,并且只要该单元格的值更改为列表中的值,就使用onEdit触发器来触发脚本。

当单元格最初更改时,脚本会按预期触发。但是,我找不到一种方法将伪按钮中的值更改回原始值而不再触发onEdit触发器。以下是我工作表中相对简单按钮的支持代码:

// If Delete Standard button is pressed
} else if (cell.getColumn() == 1 
           && cell.getRow() >= 8 
           && SpreadsheetApp.getActiveSheet().getName() == analysisSheet.getName() 
           && cell.getDisplayValue != "X") {
  Browser.msgBox("Deleted Standard: " + analysisSheet.getRange(cell.getRow(), 3).getDisplayValue(), Browser.Buttons.OK_CANCEL);
  analysisSheet.deleteRow(cell.getRow()); 

包含数据验证的列中的单元格的值为" X",并且该值更改为"删除此标准"。这会触发onEdit函数,该函数会删除所选行。有时这只会删除一行,但大多数情况下,它还会删除以下行,在少数情况下会删除三行。我试图通过声明所选的单元格值不能是" X"来限制对该函数的访问,但是在第二个触发器上,它仍然可以访问这部分代码。是的,每个被删除的行都会触发Browser.msgBox。

我的问题是,有没有办法临时禁用触发器以防止此行为发生?我没试过就试过使用以下内容:

var lock = LockService.getScriptLock();
lock.waitLock(3000);

编辑:看起来我忘了修复此问题的getDisplayValue方法后的括号。但是,我仍然喜欢暂时禁用触发器的某种解决方法。

1 个答案:

答案 0 :(得分:0)

您可以通过脚本添加/删除触发器。幸运的是,这不会删除执行历史记录。它在功能上等同于禁用触发器。这是创建和删除触发器的示例,尽管我知道您的触发器是onedit的:

#ifndef __MATRIX_H__
#define __MATRIX_H__

#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include "Vector.h"
using namespace std;

typedef unsigned int uint;

//Matrix class to handle basic linear algebra operations.
template<typename T>
class Matrix
{
    public:
        vector<vector<T> > elements;
        uint shape[2];

        // Constructors
        Matrix();
        Matrix(uint, uint);
        Matrix(vector<vector<T> >);
        Matrix(string);

        //Print vector elements.
        void print() const;

        //Print vector shape.
        void printshape() const;

        //Append a vector to the last row.
        void push_back(vector<T>);

        //Check if matrix has same shape to other matrix.
        bool has_same_shape(Matrix<T>&) const;

        //Save matrix to a text file with string filename as parameter.
        void savetext(string) const;

        //Indexing operator that returns the row as a Vector class.
        vector<T> operator[] (uint);

        //Comparison operator.
        bool operator== (Matrix<T>&);

        //Matrix transpose.
        Matrix<T> transpose();

        //Destructor.
        ~Matrix();

};

//Default Constructor.
template<typename T>
Matrix<T>::Matrix() {};

// Constructor for zero matrix with shape = num_row-by-num_col.
template<typename T>
Matrix<T>::Matrix(uint num_row, uint num_col){
    for(uint i = 0; i <= num_row; i++){
        for(uint j = 0; j <= num_col; j++){
            elements[i].push_back(0);
        }
    }
    shape[0] = num_row;
    shape[1] = num_col;
}

此外,我对按钮使用复选框验证。我仅在值是true的情况下运行代码,然后脚本最后将范围设置回false。