Google apps script 如何使用GoogleSheets(v4)API修改依赖于特定单元格的特定数据行?

Google apps script 如何使用GoogleSheets(v4)API修改依赖于特定单元格的特定数据行?,google-apps-script,google-sheets,web-applications,google-sheets-api,Google Apps Script,Google Sheets,Web Applications,Google Sheets Api,我想找到一种使用GoogleAPI根据我提供的标准修改特定数据行的方法。类似于SQL的: UPDATE Customers SET ContactName = 'Alfred Schmidt', City= 'Frankfurt' WHERE CustomerID = 1 我尝试过使用BatchUpdateDataFilter,但似乎无法使其正常工作。我刚刚意识到谷歌的查询语言,但这并没有更新 我有一个测试电子表格如下。我希望能够根据ID更新特定列 e、 在SQL中,类似于以下内容 UPDA

我想找到一种使用GoogleAPI根据我提供的标准修改特定数据行的方法。类似于SQL的:

UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1
我尝试过使用BatchUpdateDataFilter,但似乎无法使其正常工作。我刚刚意识到谷歌的查询语言,但这并没有更新

我有一个测试电子表格如下。我希望能够根据ID更新特定列

e、 在SQL中,类似于以下内容

UPDATE SET Collected = 'Yes' WHERE ID = 1
  • 您希望从外部修改电子表格的值
  • 您希望使用类似SQL的查询来修改值
  • 您希望从外部修改值
如果我的理解是正确的,那么这个答案呢

问题: 不幸的是,在当前阶段,无法使用查询语言更新电子表格的值。您可以在中查看查询语言的文档。这一点我已经提过了

因此,我想提出两种解决办法

解决方法1: 在此解决方案中,我建议使用Sheets API。从中,我可以确认您已经能够使用Sheets API输入和获取值。那么下面的流程呢

  • 使用spreadsheets.values.get方法从电子表格中检索值。
    • 在共享电子表格中,从“Sheet1”检索值
  • 使用脚本修改检索到的值。
    • 在本例中,脚本是您要使用的语言
  • 使用spreadsheets.values.update方法将修改后的值放入“Sheet1”表中
  • 解决方法2: 在这个解决方案中,我想建议使用由GoogleApps脚本创建的Web应用程序。电子表格的值通过使用Web应用程序(如API)进行修改

    作为示例情况,我使用Web应用程序实现以下查询

    UPDATE SET Collected = 'Yes' WHERE ID = 1
    
    您的共享电子表格将用作示例电子表格。在这种情况下,对于“Sheet1”的工作表,当列“A”(ID)的值为
    1
    时,列“L”(收集)的值修改为
    Yes

    用法:
  • 请打开要使用的电子表格的脚本编辑器。然后将以下脚本复制并粘贴到脚本编辑器中

    function doGet(e) {
      var p = e.parameter;
      var sheetName = "Sheet1";
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
      var range = sheet.getDataRange();
      var values = range.getValues();
      var headers = values.splice(0, 1)[0];
      var checkCol = headers.indexOf(p.checkKey);
      var modifyCol = headers.indexOf(p.modifyKey);
      values.forEach(function(e, i) {
        if (e[checkCol] == p.checkValue) {
          values[i][modifyCol] = p.modifyValue;
        }
      });
      values.unshift(headers);
      range.setValues(values);
      return ContentService.createTextOutput("Done");
    }
    
  • 请部署Web应用程序

    UPDATE SET Collected = 'Yes' WHERE ID = 1
    
  • 在脚本编辑器上,通过“发布”->“部署为web应用”打开对话框
  • 选择“用户访问web应用程序”“我”作为“执行应用程序:”选项
  • 选择“任何人,甚至匿名”“谁有权访问该应用:”。这是一个测试用例。
    • 如果只使用了
      我自己
      ,则只有您可以访问Web应用程序。届时,请使用您的访问令牌
  • 单击“部署”按钮作为新的“项目版本”
  • 自动打开“需要授权”对话框。
  • 单击“查看权限”
  • 选择自己的帐户
  • 单击“此应用未验证”处的“高级”
  • 单击“转到####项目名称###(不安全)”
  • 单击“允许”按钮
  • 复制“当前web应用程序URL:”。
    • 就像
      https://script.google.com/macros/s/#####/exec
  • 单击“确定”
  • 请使用以下示例请求Web应用程序。此时,请使用复制的Web应用程序URL。将每个值设置为查询参数

    curl -L "https://script.google.com/macros/s/###/exec?checkKey=ID&checkValue=1&modifyKey=Collected&modifyValue=Yes"
    
    • 或者,如果您想使用您的访问令牌,请使用下面的

      curl -L "https://script.google.com/macros/s/###/exec?checkKey=ID&checkValue=1&modifyKey=Collected&modifyValue=Yes&access_token=###"
      
  • 通过上面的curl命令,对于“Sheet1”的工作表,当列“A”(ID)的值为
    1
    时,列“L”(Collected)的值修改为
    Yes

    注:
  • 修改Web应用脚本时,请将Web应用重新部署为新版本。这样,最新的脚本就会反映到Web应用程序中。如果即使修改脚本也未重新部署Web应用程序,则不会使用最新的脚本。请注意这一点。
  • 参考资料:

    如果我误解了你的问题,并且这不是你想要的方向,我很抱歉。

    没有类似sql的方法来更新整个数据。如果id=行号,那么创建datafilter所需的
    aRange:
    应该不难。这是一个非常好的答案。令人难以置信的是,它不得不等到今天才进行第一次投票。令人难以置信的连贯性。塔奈克说,如果答案是2020年或2021年,我会毫不犹豫地盲目遵循你的大纲。让我有点难过的是,我最终不会使用它——如果你个人还在意的话,除了投票之外还留下一些东西:根据最新版本(0.7,截至评论)的文档,你在第一段中链接到了以前的版本,来自客户机的类似SQL的查询(!)现在,通过HTTP到google的表单显然可以通过绕道图表API在本地获得。谷歌甚至提供了多种语言的易于使用的包装(包括浏览器的JS)Google.visualization.Query。今天看起来好像真的很简单。祝你好运。(我很快就会知道的