【问题标题】:Writing to Google Sheets without authentication无需身份验证即可写入 Google 表格
【发布时间】:2017-12-10 11:13:25
【问题描述】:

在我的一个项目中,我需要将应用程序(iOS 和 Android)中的数据写入 Google 表格文档。我需要将数据写入不属于用户的电子表格,电子表格在我的公司帐户下。

根据文档,对于这种类型的场景,我可以使用 Create credentials > API key 来设置非身份验证密钥。
我担心任何人都可以在应用程序中获取此密钥(使用一些基本的逆向工程方法)。我有一个想法来创建一个具有 只写 凭据的用户,并使用他的 API-KEY 来执行 API 请求。但我确信有更好的方法来实现这一点。

我有哪些选择?非常感谢!

【问题讨论】:

    标签: android ios mobile google-sheets google-spreadsheet-api


    【解决方案1】:

    您可以使用 google 应用程序脚本来分解一个任何人甚至可以匿名访问的 web 应用程序,然后在您的应用程序中创建一个运行该脚本的 Async 方法。 可以在此处查看此类 webapp 的示例:https://gist.github.com/petyr47/7af08ec2d982399c1b4ace2734597d3b.js 然后你可以添加一个如下所示的 AsyncTask 方法:

    public class SendRequest extends AsyncTask<String, Void, String> {
    
    
            protected void onPreExecute(){}
    
            protected String doInBackground(String... arg0) {
    
                try{
    
                    //Enter script URL Here
                    URL url = new URL("Your App Script Web App URL");
    
                    JSONObject postDataParams = new JSONObject();
    
                    //Passing scanned code as parameter
    
                   postDataParams.put("sdata",scannedData);
    
    
                    Log.e("params",postDataParams.toString());
    
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(15000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.setDoOutput(true);
    
                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(getPostDataString(postDataParams));
    
                writer.flush();
                writer.close();
                os.close();
    
                int responseCode=conn.getResponseCode();
    
                if (responseCode == HttpsURLConnection.HTTP_OK) {
    
                    BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    StringBuffer sb = new StringBuffer("");
                    String line="";
    
                    while((line = in.readLine()) != null) {
    
                        sb.append(line);
                        break;
                    }
    
                    in.close();
                    return sb.toString();
    
                }
                else {
                    return new String("false : "+responseCode);
                }
            }
            catch(Exception e){
                return new String("Exception: " + e.getMessage());
            }
        }
    
        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), result,
                    Toast.LENGTH_LONG).show();
    
        }
    }
    
    public String getPostDataString(JSONObject params) throws Exception {
    
        StringBuilder result = new StringBuilder();
        boolean first = true;
    
        Iterator<String> itr = params.keys();
    
        while(itr.hasNext()){
    
            String key= itr.next();
            Object value = params.get(key);
    
            if (first)
                first = false;
            else
                result.append("&");
    
            result.append(URLEncoder.encode(key, "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(value.toString(), "UTF-8"));
    
        }
        return result.toString();
    }
    

    }

    您可以使用以下方法执行此方法:

     new SendRequest().execute();
    

    将方法中的参数替换为您要发送的参数。 希望这会有所帮助

    虽然这是 android 的解决方案,但我对 iOS 无能为力,但您可以应用相同的原则。

    【讨论】:

    • 嘿!感谢您的回复!在安全方面,脚本的内容是否可见?即您可以看到我正在写入的工作表 ID 是什么?
    • 不,用户将无法看到工作表。只有您可以,并且您可以控制对工作表的访问
    猜你喜欢
    • 2013-09-12
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多